Warum kein Alpha im BufferedImage?

kuhlmaehn

Erfahrenes Mitglied
Hi,
ich hab jetzt gute 30 Minuten google durchforstet und darum frag ich jetzt mal :)
Warum wird in diesem Beispiel nicht als Alpha-Wert 0 ausgegeben, sondern 255 und wie setze bzw. lese ich den Alpha-Kanal denn dann richtig?
Code:
BufferedImage bi = new BufferedImage(40, 40, BufferedImage.TYPE_INT_ARGB);

for(int x = 0; x < bi.getWidth(); x++) {
	for(int y = 0; y < bi.getHeight(); y++) {
		Color col = new Color(22, 66, 88, 0);
		int gcol = col.getRGB();
		bi.setRGB(x, y, gcol);
	}
}

int x = 4;
int y = 4;
Color c = new Color(bi.getRGB(x, y));
System.out.println(c.getRed() + " : " + c.getGreen() + " : " + c.getBlue() + " : " + c.getAlpha());
Danke!
 

mjkraus

Mitglied
Hallo,

ich bin grad an etwas ähnlichem gesessen, und dann bei Bit-Operatoren und hexadezimalen Literalen gelandet. Ich hab dir mal meinen Code umgeschrieben:
Java:
Color col = new Color(22, 66, 88, 0);

for(int x = 0; x < bi.getWidth(); x++){
  for(int y = 0; y < bi.getHeight(); y++){
    bi.setRGB(x, y, (col.getAlpha() << 24) | (col.getRGB() & 0x00FFFFFF) );
  }
}
Ich hoffe du kommst damit weiter. :) Warum das nicht über setRGB() funktioniert weiß ich auch nicht.

Ciao!
 
Zuletzt bearbeitet:

zerix

Hausmeister
Moderator
Hallo,

es liegt nicht an der setRGB-Methode, sondern an dem neuen Color-Objekt. Also das setzen deines ARGB-Werte funktioniert.
In diese Konstruktor den du da nutzt, sollst du die RGB-Werte in einem int-Wert übergeben. Wie gesagt, du sollst da die RGB-Werte übergeben und nicht die ARGB-Werte, d. h. der Alpha-Wert wird da ignoriert.
Das sieht man auch, wenn man in den Konstruktor reinschaut.

Code:
this.value = (0xFF000000 | paramInt);

Hier wird nicht der übergebene Wert genommen, sondern der Alpha-Wert wird standardmäßig auf 255 gesetzt.

Wenn du schauen möchtest, welche Werte gesetzt sind, an einem bestimmten Pixel kannst du das so tun.

Java:
int argb = bi.getRGB();
int alpha = (argb >> 24) & 0xFF;
int red = (argb >> 16) & 0xFF;
int green = (argb >> 8) & 0xFF;
int blue = (argb) & 0xFF;

Das ganze könnte man auch in eine Methode packen, die ein int-Array zurückgibt.

Java:
public static int[] getRgbValues(int rgb){
		int argb = rgb;

		int[] toReturn = new int[4];
		
                toReturn[0] = (argb >> 24) & 0xFF;
		toReturn[1] = (argb >> 16) & 0xFF;
		toReturn[2] = (argb >> 8) & 0xFF;
		toReturn[3] = (argb) & 0xFF;
		
		return toReturn;
	}

Gruß

Sascha
 

kuhlmaehn

Erfahrenes Mitglied
Hi und vielen Dank euch, sorry dass ich mich erst jetzt melde. War etwas im Stress...
Ich hab es jetzt einfach so gelöst, dass ich ein zweites Bild nehme, wo ich nur den Rot-Kanal als Alpha-Kanal verwende. Etwas blöd aber es hat gereicht ;)
Beim nächsten mal weiß ich jetzt wie es funktioniert also danke nochmal! :)
 

javaDeveloper2011

Erfahrenes Mitglied
Hallo zusammen,

hatte das gleiche Problem.
Vielen Dank!

Hier mein Code zum invertieren eines BufferedImage, wobei die Transparenz erhalten bleibt:
Java:
for (int i = 0; i < bufferedImage.getHeight(); i++) {
        for (int j = 0; j < bufferedImage.getWidth(); j++) {
            Color c = new Color(bufferedImage.getRGB(j, i));
            int alpha = bufferedImage.getAlphaRaster().getSample(j, i, 0);
            bufferedImage.setRGB(j, i, new Color(255 - c.getRed(), 255 - c.getGreen(), 255 - c.getBlue()).getRGB());
            bufferedImage.getAlphaRaster().setSample(j, i, 0, alpha);
      }
}
Vielleeicht hilfts ja jemandem...

Gruß javaDeveloper2011