# BufferedImage Farbe "Transparent"



## The_S (5. Okt 2005)

Wie komme ich an die "Farbe Transparent" ran? Also dass ich keinen weißen Hintergrund bei einem BufferedImage hab, sondern dass einfach das, was nicht mit anderer Farbe beschmiert ist die dahinterliegende Komponente freigibt? Hoff ich konnt mich einigermaßen klar ausdrücken :wink: .


----------



## Roar (5. Okt 2005)

new Color(0, 0, 0, 0)


----------



## The_S (6. Okt 2005)

Danke, wie kann ich die Farbe dann einem Pixel eines BufferedImages zuweisen?


```
buffimage.setRGB(x, y, new Color(0, 0, 0, 0).getRGB());
```

dürfte ja nicht gehen!?


----------



## thE_29 (6. Okt 2005)

seit wann ist 0,0,0 transparent??

Das ist ja weiß oder??


----------



## The_S (6. Okt 2005)

0,0,0 ist schwarz :wink: . Ich denk ma das liegt an der 4. 0 die du vergessen hast. Aber ansonsten kA, ich hab ja gefragt. Hatte auch noch keine Zeit das zu testen.


----------



## m@nu (6. Okt 2005)

damit du in einem BufferedImage transparente farben verwenden kannst, musst du das entsprechende flag beim erstellen des objektes setzen:

```
BufferedImage transparancy = new BufferedImage(100,100, BufferedImage.TYPE_INT_ARGB);
```

der code von roar stimmt... die vierte 0 gibt den transparenz-level an (entweder als float (0.0 bis 1) oder als int (0-255))
hab das auch schon einige male so verwendet  (so lassen sich z.b. mit AWT nette overlayeffekte erstellen)


----------



## The_S (6. Okt 2005)

Ah, danke! Aber meinen Code, bei dem ich jetzt z. B.


```
buffImage.setRGB(x, y, col.getRGB());
```

muss ich deswegen jetzt nicht umschreiben oder?


----------



## m@nu (6. Okt 2005)

mit dem spezifischen setzen von pixeln in einem BufferedImage habe ich leider keine erfahrungen...
denke aber, das sollte gehen


----------



## The_S (6. Okt 2005)

ok, ich werds später einfach mal ausprobieren :wink:


----------



## The_S (6. Okt 2005)

Funktioniert nicht so richtig. Möchte jetzt mal testhalber alle Weißwerte Transparent machen. Das mache ich so:


```
for (int i = img.getWidth() - 1; i > -1; i--) {
	for (int j = img.getHeight() - 1;  j > -1; j--) {
		if (img.getRGB(i, j) == new Color(255,255,255).getRGB()) {
			img.setRGB(i, j, new Color(0, 0, 0, 0).getRGB());
		}
	}
}
```

Wenn ich das dann speichere, ist alles schwarz was nicht weiß war und was weiß war hat so nen komischen Rosa-Hautfarbenen ton.


----------



## m@nu (6. Okt 2005)

das mit dem rosa-ton habe ich auch schon einmal bemerkt...
komischerweise ist der rosa-ton aber nicht vorhanden, wenn du das ganze wieder mit java einliest :-/


----------



## The_S (6. Okt 2005)

Stimmt, soblad ich das wieder mit Java einlese hab ich das ganz normale Bild ???:L


----------



## The_S (7. Okt 2005)

Keine eine Idee woran das liegen könnte und wie man das umgehen kann? Ich speichere das Bild mit ImageIO.


----------



## m@nu (7. Okt 2005)

hatte das phänomen einmal bei meiner ThumbnailFactory gesehen... unterdessen hab ich das prob nicht mehr... denke es liegt daran, dass mein BufferedImage kein ARGB mehr ist :-/

in welchem format speicherst du dein BufferedImage denn auf die platte?


----------



## The_S (7. Okt 2005)

Welches hätteste den gerne :wink: ? Alles in was ImageIO speichern kann! Bei meinem Beispiel wars jpg


----------



## m@nu (7. Okt 2005)

hm, dann liegts an dem, wo ich oben beschrieben habe...
wieso willst du transparenz in ein JPG speichern? JPG unterstützt keine transparenz...

wenn du aber doch in ein JPG speichern willst, versuchs mal so:

```
BufferedImage toSave = new BufferedImage(100, 100, BufferedImage.TYPE_INT_BGR);
toSave.getGraphics().drawImage(deinBufferedImage, 0, 0, Color.BLACK, null);

try {
    ImageIO.write(toSave, "jpeg", new File("ausgabe.jpg"));
} catch (IOException e) {
    e.printStackTrace();
}
```

alles was transparent ist, wird in diesem beispiel mit schwarz hinterlegt...


----------



## The_S (7. Okt 2005)

Werds mal ausprobieren! Danke!

[edit] danke so gehts


----------



## The_S (10. Okt 2005)

Nochmal 3 Fragen:

1. Warum kann ich in einem *.png nur komplette oder gar keine Transparenz speichern? Speichere mit ImageIO und in meinem Javaprogramm wird die Transparenz richtig angezeigt.

2. Ich hole mir mit 
	
	
	
	





```
ImageIO.getWriterFormatNames()
```
 alle Dateiendungen in die geschrieben werden kann. Das sind *.jpg, *.jpeg, *.png, *.bmp, und *.wbmp Allerdings kann ich nur JPEG und PNG Bilder anschließend wieder lesen (egal ob mit meinem Javaprogramm oder mit einem Anderen)

3. Kann ich auch irgendwie andere Formate speichern (z. B. *.gif)?


----------



## m@nu (10. Okt 2005)

1. denke mal, das liegt hierbei daran, dass du per drawImage die transparenz ja quasi wieder "eliminierst" ... der schwarze hintergrund schimmert durch das transparente durch...

2. hast du versucht per ImageIO wieder einzulesen? ... denke, dann sollte es gehen

3. :arrow: http://www.gif4j.com/java-gif4j-pro-gif-image-encode-save.htm
mit einer zusätzlichen filter-klasse scheint das möglich zu sein


----------



## The_S (10. Okt 2005)

1. Wie meinst du das mit drawImage? Mein Bild wird in meiner GUI z. B. "Halb-Transparent" angezeigt. Die anzeige verweißt auf ein BufferedImage, welches ich dann auch mit ImageIO speichere

2. Jup, versuche via ImageIO wieder einzulesen und es geht komischerweiße nicht ???:L 

3. Danke, werd ich mir mal anschauen.


----------



## m@nu (10. Okt 2005)

1. in dem beispiel dass ich dir mal gepostet habe, wird das BufferedImage in ein weiteres BufferedImage gezeichnet, welches nicht mehr ARGB ist ... (wegen dem rosa-effekt)
denke, wenn man da ein wenig herumspielt, sollte man das hinbekommen

2. hmm, komisch... hast du das PNG mal im photoshop o.ä. geöffnet? wird die transparenz wirklich korrekt gespeichert? (siehe 1.  )


----------



## The_S (10. Okt 2005)

1. Das wird ja nur bei jpg angewand. Beim rest muss ich bei dem Image ja nicht nochmal die Transparenz durch schwarz ersetzen

2. Nö, nirgendwo wird es teilweise transparent angezeigt. Aber ich stelle das selbe BufferedImage in meiner GUI dar, wie ich es auch später mit ImageIO speichere.

Wenn dir ein wenig Code weiterhelfen würde, dann sag mir was du brauchst :wink:


----------

