Win32-Zwischenablage und Alphakanalbilder

Meine Anwendung sollte in der Lage sein, 32-Bit-Bilder (RGB + Alpha-Kanal) in die Zwischenablage zu kopieren und diese Bilder aus der Zwischenablage einzufügen. Dafür habe ich vor zu nutzenCF_DIBV5 weil derBITMAPV5HEADER Struktur hat ein FeldbV5AlphaMask.

Das Problem ist, dass es keinen Konsens darüber zu geben scheint, wie genau die Bilddaten in der Zwischenablage gespeichert werden sollen. Während einiger Tests stellte ich fest, dass es verschiedene Unterschiede zwischen den Anwendungen gibt, die es nahezu unmöglich machen, eine allgemeine Lösung zu finden.

Hier sind meine Beobachtungen:

Wenn ich ein Alphakanalbild aus Word 2010 oder XnView in die Zwischenablage kopiere, wird es gespeichert, ohne dass vorab Pixeldaten multipliziert werden.

Wenn ich ein Bild mit Firefox oder Chrome kopiere, scheinen die Pixeldaten jedoch durch den Alpha-Kanal vorvervielfacht zu werden.

Firefox setztbV5AlphaMask zu 0xff000000, wohingegen die meisten anderen Anwendungen dies überhaupt nicht einstellen, sondern auf 0 belassen. Dies ist merkwürdig, da diese Anwendungen DIBs in die Zwischenablage legen, die tatsächlich einen Alphakanal in den höchsten 8 Bits enthalten, diese aber immer noch einstellenbV5AlphaMask Man muss also davon ausgehen, dass es bei einer Bittiefe von 32 auch dann einen Alpha-Kanal gibt, wennbV5AlphaMask ist 0.

Kurz gesagt, meine grundlegende Frage lautet: Gibt es offizielle Informationen darüber, wie Alphakanaldaten in der Zwischenablage gespeichert werden sollen? Mich interessiert vor allem, ob die Daten vorvervielfacht werden müssen oder nicht. Wie Sie oben sehen können, vervielfachen sich Word 2010 und XnView nicht vorzeitig, wohingegen Firefox und Chrome dies tun. Es ist jedoch von wesentlicher Bedeutung zu wissen, ob die Farbkanäle vorvervielfältigt werden sollen oder nicht.

Vielen Dank, dass Sie ein bisschen Licht in diese Sache gebracht haben!

UPDATE 2 Das Einfügen in Paint.NET funktioniert jetzt einwandfrei. Dies wurde durch einen Fehler in meinem Code verursacht, durch den die Farbkanäle nicht auf 0 gesetzt wurden, wenn der Alphakanal 0 war, d. H. Die Vorvervielfachung wurde in diesem Fall nicht korrekt durchgeführt, was Paint.NET verwirrt zu haben scheint.

Das Problem mit Internet Explorer 10 ist noch ungelöst. Wenn Sie ein PNG mit Alphakanal in die Zwischenablage kopieren, wird in IE 10 nur ein 24-Bit-CF_DIBV5 in die Zwischenablage eingefügt. Paint.NET kann dieses Bitmap jedoch mit Alphakanal einfügen, sodass ein anderes Format erforderlich ist dass IE 10 in der Zwischenablage verfügbar macht. Möglicherweise werden in PNGs CFSTR_FILECONTENTS und CFSTR_FILEDESCRIPTOR verwendet.

AKTUALISIEREN Ich habe es jetzt in der von arx unten beschriebenen Weise implementiert und es funktioniert ziemlich gut. Es gibt jedoch noch zwei Dinge, die mich verwundern:

1) Beim Einfügen von Alphakanalbildern aus meiner App in Paint.NET bleibt der Alphakanal nicht erhalten. Das Bild wird in Paint.NET undurchsichtig angezeigt. Das Einfügen von Firefox und Chrome in Paint.NET funktioniert jedoch einwandfrei. Der Alphakanal bleibt erhalten! Ich habe das komplette DIBV5 ausgelagert und es ist identisch mit meiner App, aber es funktioniert immer noch mit FF und Chrome, aber nicht mit meiner App, also muss es noch etwas anderes geben! Firefox und Chrome müssen noch etwas tun, was meine App nicht kann !?

2) Gleiches gilt für Internet Explorer 10. Das Einfügen eines Alphakanalbilds aus IE 10 in meine App funktioniert überhaupt nicht ... Ich erhalte eine DIB mit einer Bittiefe von 24, dh, es ist kein Alphakanal vorhanden alles. Beim Einfügen von IE 10 in Paint.NET ist der Alphakanal jedoch vorhanden! Also muss auch hier etwas mehr dran sein ...

Antworten auf die Frage(2)

Ihre Antwort auf die Frage