# BufferedImage aus PNG Files haben keinen Type



## javimka (5. Jan 2010)

ImageIO ist eine tolle Klasse, aber wie kommt sie dazu, BufferedImages zu produzieren, die zu sich selbst nicht kompatibel sind?!?

Ich lese zuerst mit ImageIO ein png ein, was auch funktioniert. Dann will ich ein Bild erstellen mit denselben Eigenschaften, insbesondere mit demselben Typ. Aber das eingelesene BufferedImage hat den Typ TYPE_CUSTOM. Der Versuch, ein zweites BufferedImage dieses Typs zu erstellen, schlägt fehl. KSKB:

```
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;

public class IncompatibleBufferedImage {

	public static void main(String[] args) {
		try {
			URL url = new URL("http://upload.wikimedia.org/wikipedia/"+
					"commons/4/47/PNG_transparency_demonstration_1.png");
			BufferedImage image1 = ImageIO.read(url);
			BufferedImage image2 = new BufferedImage(100,100,image1.getType());
			System.out.println(image2.toString());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
```


```
Exception in thread "main" java.lang.IllegalArgumentException: Unknown image type 0
	at java.awt.image.BufferedImage.<init>(BufferedImage.java:490)
	at ch.lantersoft.klopfer.IncompatibleBufferedImage.main(IncompatibleBufferedImage.java:14)
```

Bei .gifs und .jpgs funktioniert es problemlos, aber nicht bei pngs. Scheinbar muss ich für jedes Bild, das ich einlese und ein gleichwertiges Image erstellen will, zuerst prüfen ob der Type==0 ist und ggf. den Type Transparency.TRANSLUCENT verwenden, der auch BufferedImage.TYPE_INT_ARGB_PRE entspricht.

Gibts einen bestimmten Grund, wieso png so widerspenstig sind?


----------



## dayaftereh (6. Jan 2010)

Hey;

Vieleicht Hilft dir das hier:


```
BufferedImage in = ImageIO.read(srcFile);
		GraphicsConfiguration gc = in.createGraphics().getDeviceConfiguration();
		BufferedImage out = gc.createCompatibleImage(targetWidth, targetHeight,	BITMASK);
		Graphics2D g2d = out.createGraphics();
		g2d.setComposite(AlphaComposite.Src);
		g2d.drawImage(in, 0, 0, targetWidth, targetHeight, null);
		g2d.dispose();
		ImageIO.write(out, "png", destFile);
```


----------



## javimka (7. Jan 2010)

Vielen Dank, das ist eine super Idee. Ich wusste nicht, dass Graphics2D über die Methode getDeviceConfiguration() verfügt.


----------



## dayaftereh (7. Jan 2010)

Aber warum das ist! Kann ich dir leider nicht sagen! Also was für eine Typ PNG hat!!!


----------



## annonymous (20. Mrz 2012)

vielleicht noch einfacherer ist, den ByteArrayInputStream in ImageIO.read packen ...


```
BufferedImage bufferedImage = ImageIO.read(new FileInputStream("c:\\Temp\\Screen.PNG"));
        ImageIO.write(bufferedImage, "png", new File("c:\\Temp\\newImage.png"));
```


----------

