Java transparent PNG in die Zwischenablage

9

Ich versuche, eine PNG-Datei innerhalb eines Programms in die Zwischenablage zu kopieren und ihren Alpha-Kanal beizubehalten, wenn sie in ein anderes Programm eingefügt wird (z. B. MS Office, Paint, Photoshop). Das Problem ist, dass der Alpha-Kanal in den meisten Programmen schwarz wird. Ich habe jetzt stundenlang im Internet gesucht und kann keine Lösung finden. Der Code, den ich verwende:

%Vor%

Gibt es eine Möglichkeit, den Alpha-Kanal in Java zu pflegen? Ich habe versucht, die PNG zu BufferedImage, Image, etc. und das Einfügen in die Zwischenablage, aber nichts funktioniert.

    
Chris 23.01.2013, 20:55
quelle

3 Antworten

1

Angenommen, OSDetector funktioniert ordnungsgemäß, konnte ich den Code des OP unter Windows Server 2008R2 64-Bit mit Oracle JDK 1.8.0_131 ausführen. Das OP hat den Code für getBufferedImage() weggelassen, aber ich vermute, dass es eine Variante der Version von dieses Blog .

Als ich den Code mit der Blog-Version von getBufferedImage() unter Windows getestet habe (ohne den OSDetector check), konnte ich eine Variante des Problems reproduzieren, bei der das gesamte Bild schwarz war, was sich als a erwies Zeitproblem mit den asynchronen Aufrufen von Image.getWidth() , Image.getHeight() und Graphics.drawImage() , die alle sofort zurückkehren und einen Beobachter für asynchrone Aktualisierungen verwenden. Der Blog-Code übergibt null (kein Beobachter) für alle diese Aufrufe und erwartet, dass Ergebnisse sofort zurückgegeben werden, was beim Testen nicht der Fall war.

Sobald ich getBufferedImage() geändert habe, um Rückrufe zu verwenden, habe ich das genaue Problem reproduziert: Alphakanäle erscheinen schwarz. Der Grund für dieses Verhalten ist, dass das Bild mit der Transparenz in einem Grafikkontext gezeichnet wird, der standardmäßig auf einer schwarzen Leinwand basiert. Was Sie sehen, ist genau das, was Sie sehen würden, wenn Sie das Bild auf einer Webseite mit schwarzem Hintergrund sehen würden.

Um dies zu ändern, habe ich einen Hinweis von dieser StackOverflow-Antwort verwendet und den Hintergrund weiß gemalt.

Ich habe die ImageSelection Implementierung von diese Seite zu verwenden, die einfach ein% co_de umschließt % Instanz in einem Image mit Transferrable .

Für meine Tests funktionierten sowohl das Originalbild als auch die gepufferten Bildvarianten unter Windows. Unten ist der Code:

%Vor%

Ich hoffe, das hilft. Viel Glück.

    
Alejandro C De Baca 14.05.2017, 06:21
quelle
1

Ist das die richtige Antwort? Hast du das versucht?

%Vor%

Quelle: Ссылка

Ich selbst habe das nicht versucht, und ich bin mir da nicht sicher. Hoffentlich bekommst du richtige Antwort.

    
Kuvaaja 08.05.2017 09:54
quelle
1

Hier ist ein sehr einfaches, eigenständiges Beispiel, das funktioniert. Das Lesen oder Erstellen des Bildes liegt bei Ihnen. Dieser Code erstellt nur einen roten Kreis, der auf einem BufferedImage vom Alpha-Typ gezeichnet wird. Wenn ich es in ein Programm einfüge, das Transparenz unterstützt, wird es korrekt angezeigt. Hoffe es hilft.

%Vor%     
swilson 10.05.2017 21:53
quelle

Tags und Links