Ändern Sie den Alpha-Wert eines BufferedImage?

7

Wie ändere ich den globalen Alpha-Wert eines BufferedImage in Java? (Machen Sie jedes Pixel im Bild mit einem Alpha-Wert von 100 mit einem Alpha-Wert von 80)

    
William 19.03.2009, 00:07
quelle

6 Antworten

4

Ich glaube nicht, dass es einen einzigen einfachen Befehl gibt, dies zu tun. Ein paar Optionen:

Die erste ist die einfachste zu implementieren, IMO.

    
Michael Brewer-Davis 19.03.2009, 00:38
quelle
9

@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.

    
Felix 17.04.2009 21:28
quelle
4

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.

AlphaComposite

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.

BufferedImageOps

LookupOp

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.

RescaleOp

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:

%Vor%

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.

    
LarsH 11.04.2012 15:14
quelle
2

Für einen netter aussehenden Alpha-Änderungseffekt können Sie die relative Alpha-Änderung pro Pixel verwenden (anstelle einer statischen oder linearen Begrenzung)

%Vor%     
Thumbz 07.05.2014 08:13
quelle
1

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.

    
Neil Coffey 19.03.2009 00:32
quelle
0

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

    
Don Smith 18.03.2018 18:45
quelle

Tags und Links