Ändern Sie den alpha-Wert eines BufferedImage?
Wie ändere ich die Globale alpha-Wert eines BufferedImage im Java? (I. E. jedes pixel im Bild mit einem alpha-Wert von 100 haben einen alpha-Wert von 80)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube nicht, dass es einen einfachen Befehl, dies zu tun. Ein paar Optionen:
Die erste ist am einfachsten zu implementieren, IMO.
@Neil Coffey:
Danke, habe ich dies auch; aber, Ihr code hat nicht funktioniert bei mir sehr gut (weiß hintergrund wurde schwarz).
Codiert ich so etwas wie dieses und es funktioniert perfekt:
Wo obj_img ist BufferedImage.TYPE_INT_ARGB.
Ich ändern alpha mit setAlpha((byte), 125); alpha-Bereich ist nun 0-255.
Hoffe jemand findet das nützlich.
color
int?Dies ist eine alte Frage, so bin ich nicht zu beantworten, wegen der OP, aber für diejenigen, die wie ich finde diese Frage später.
AlphaComposite
Als @Michael die hervorragende Gliederung erwähnt, ein AlphaComposite Betrieb ändern kann, den alpha-Kanal. Aber nur in gewisser Weise, was für mich etwas schwer zu verstehen:
ist die Formel, wie die "über" - Betrieb wirkt sich auf den alpha-Kanal. Außerdem, dies wirkt sich auf die RGB-Kanäle zu, so dass, wenn Sie haben Farb-Daten, die benötigt werden, unverändert, AlphaComposite ist nicht die Antwort.
BufferedImageOps
LookupOp
Gibt es mehrere Sorten von BufferedImageOp (siehe 4.10.6 hier). In dem Allgemeinen Fall, der OP hat die Aufgabe konnte erfüllt werden, indem eine LookupOp, die erfordert, Gebäude-lookup-arrays. Ändern Sie nur den alpha-Kanal, Versorgung eine Identität array (ein array, wo die Tabelle[i] = i) für den RGB-Kanälen und einem separaten array für den alpha-Kanal. Füllen Sie die letzteren array mit
table[i] = f(i)
, wof()
ist die Funktion, die Sie zuordnen möchten, aus alten alpha-Wert auf "neu". E. g. wenn Sie wollen, jedes pixel im Bild mit einem alpha-Wert von 100 haben einen alpha-Wert von 80", eingestellttable[100] = 80
. (Der vollständige Bereich ist 0 bis 255.) Sehen so erhöhen Sie die Deckkraft in Gaußscher Weichzeichner für ein code-Beispiel.RescaleOp
Aber für einen Teil dieser Fälle, es ist ein einfacher Weg, es zu tun, nicht erforderlich ist, ist die Einrichtung einer lookup-Tabelle. Wenn
f()
ist eine einfache, lineare Funktion, verwenden Sie eine RescaleOp. Wenn Sie beispielsweise festlegen möchtennewAlpha = oldAlpha - 20
verwenden Sie eine RescaleOp mit einem scaleFactor 1 und einen offset von -20. Wenn Sie festlegen möchtennewAlpha = oldAlpha * 0.8
verwenden Sie einen scaleFactor von 0,8 und einem offset von 0. In beiden Fällen, Sie wieder zu haben, um dummy-scaleFactors und offsets für die RGB-Kanäle:Wieder sehen 4.10.6 hier für einige Beispiele, die veranschaulichen, die Grundsätze gut, aber sind nicht spezifisch für die alpha-Kanal.
Beide RescaleOp und LookupOp ermöglichen das ändern eines BufferedImage-in-place.
für ein schöner Blick alpha-Effekt, können Sie mithilfe der relativen alpha-änderung pro pixel (anstatt statisch einstellen, oder clipping linear)
Ich bin mir zu 99% sicher, dass die Methoden, die behaupten, der Umgang mit einem "RGB-Wert" verpackt in ein int tatsächlich viel mit ARGB. So sollten Sie in der Lage sein, etwas zu tun:
For speed, könnte man vielleicht verwenden Sie die Methoden zum abrufen von Blöcken von Pixelwerten.
Möglicherweise müssen Sie zuerst kopieren Sie Ihre BufferedImage um ein Bild vom Typ
BufferedImage.TYPE_INT_ARGB
. Wenn Ihr Bild von sich geben, sagen,BufferedImage.TYPE_INT_RGB
, dann die alpha-Komponente nicht korrekt eingestellt werden. Wenn dein BufferedImage vom TypBufferedImage.TYPE_INT_ARGB
, dann wird der code unten funktioniert./**
* Modifies each pixel of the BufferedImage so that the selected component (R, G, B, or A)
* is adjusted by delta. Note: the BufferedImage must be of type BufferedImage.TYPE_INT_ARGB.
* @param src BufferedImage of type BufferedImage.TYPE_INT_ARGB.
* @param colorIndex 0=red, 1=green, 2=blue, 3= alpha
* @param delta amount to change component
* @return
*/
public static BufferedImage adjustAColor(BufferedImage src,int colorIndex, int delta) {
int w = src.getWidth();
int h = src.getHeight();
assert(src.getType()==BufferedImage.TYPE_INT_ARGB);
for (int y = 0; y < h; y++)
for (int x = 0; x < w; x++) {
int rgb = src.getRGB(x,y);
java.awt.Color color= new java.awt.Color(rgb,true);
int red=color.getRed();
int green=color.getGreen();
int blue=color.getBlue();
int alpha=color.getAlpha();
switch (colorIndex) {
case 0: red=adjustColor(red,delta); break;
case 1: green=adjustColor(green,delta); break;
case 2: blue=adjustColor(blue,delta); break;
case 3: alpha=adjustColor(alpha,delta); break;
default: throw new IllegalStateException();
}
java.awt.Color adjustedColor=new java.awt.Color(red,green,blue,alpha);
src.setRGB(x,y,adjustedColor.getRGB());
int gottenColorInt=src.getRGB(x,y);
java.awt.Color gottenColor=new java.awt.Color(gottenColorInt,true);
assert(gottenColor.getRed()== red);
assert(gottenColor.getGreen()== green);
assert(gottenColor.getBlue()== blue);
assert(gottenColor.getAlpha()== alpha);
}
return src;
}
private static int adjustColor(int value255, int delta) {
value255+= delta;
if (value255<0) {
value255=0;
} else if (value255>255) {
value255=255;
}
return value255;
}