Ich glaube nicht, dass es einen einzigen einfachen Befehl gibt, dies zu tun. Ein paar Optionen:
Die erste ist die einfachste zu implementieren, IMO.
@Neil Coffey: Danke, ich habe auch danach gesucht; Ihr Code funktionierte jedoch nicht sehr gut für mich (weißer Hintergrund wurde schwarz).
Ich habe so etwas codiert und es funktioniert perfekt:
%Vor%Dabei ist obj_img BufferedImage.TYPE_INT_ARGB.
Ich ändere Alpha mit setAlpha ((Byte) 125); Alpha-Bereich ist jetzt 0-255.
Hoffe, jemand findet das nützlich.
Das ist eine alte Frage, also antworte ich nicht um des OP willen, sondern für diejenigen wie mich, die diese Frage später finden.
Wie @ Michaels exzellenter Umriss bereits erwähnt wurde, kann eine AlphaComposite-Operation den Alphakanal modifizieren. Aber nur in gewisser Hinsicht, die mir etwas schwer verständlich sind:
ist die Formel für die Auswirkungen der Operation "over" auf den Alphakanal. Darüber hinaus wirkt sich dies auch auf die RGB-Kanäle aus. Wenn Sie also Farbdaten haben, die unverändert bleiben müssen, ist AlphaComposite nicht die Antwort.
Es gibt verschiedene Varianten von BufferedImageOp (siehe 4.10.6 hier ). Im allgemeineren Fall könnte die Aufgabe des OP durch eine erfüllt werden LookupOp , das das Erstellen von Lookup-Arrays erfordert. Um nur den Alpha-Kanal zu ändern, müssen Sie ein Identity-Array (ein Array mit Tabelle [i] = i) für die RGB-Kanäle und ein separates Array für den Alpha-Kanal bereitstellen. Füllen Sie das letztere Array mit table[i] = f(i)
, wobei f()
die Funktion ist, mit der Sie den alten Alpha-Wert zu new mappen möchten. Z.B. Wenn Sie "jedes Pixel in dem Bild mit einem Alpha-Wert von 100 einen Alpha-Wert von 80 haben möchten", setzen Sie table[100] = 80
. (Der gesamte Bereich liegt zwischen 0 und 255.) Siehe zum Erhöhen der Deckkraft in der Gauß'schen Unschärfe für ein Codebeispiel.
Aber für eine Teilmenge dieser Fälle gibt es einen einfacheren Weg, dies zu tun, ohne dass eine Nachschlagetabelle eingerichtet werden muss. Wenn f()
eine einfache, lineare Funktion ist, verwenden Sie RescaleOp . Wenn Sie beispielsweise newAlpha = oldAlpha - 20
festlegen möchten, verwenden Sie ein RescaleOp mit einem scaleFactor von 1 und einem Offset von -20. Wenn Sie newAlpha = oldAlpha * 0.8
einstellen wollen, verwenden Sie einen scaleFactor von 0.8 und einen Offset von 0. In beiden Fällen müssen Sie wiederum Dummy-ScaleFactors und Offsets für die RGB-Kanäle angeben:
Siehe auch 4.10.6 hier für einige Beispiele, die die Prinzipien gut veranschaulichen, aber sind nicht spezifisch für den Alpha-Kanal.
Sowohl RescaleOp als auch LookupOp ermöglicht die direkte Änderung eines BufferedImage.
Ich bin zu 99% sicher, dass die Methoden, die behaupten, mit einem "RGB" -Wert zu arbeiten, der in einen int gepackt wird, tatsächlich mit ARGB umgehen. Also solltest du etwas tun können wie:
%Vor%Für die Geschwindigkeit könnten Sie vielleicht die Methoden verwenden, um Blöcke von Pixelwerten abzurufen.
Möglicherweise müssen Sie zuerst BufferedImage in ein Bild vom Typ BufferedImage.TYPE_INT_ARGB
kopieren. Wenn Ihr Bild vom Typ% c% ist, wird die Alphakomponente nicht richtig gesetzt. Wenn Ihr BufferedImage vom Typ BufferedImage.TYPE_INT_RGB
ist, funktioniert der folgende Code.
BufferedImage.TYPE_INT_ARGB
Tags und Links java graphics bufferedimage