ImageIO not able to write a JPEG file
OpenJDK does not have a native JPEG encoder, try using Sun's JDK, or using a library (such as JAI
AFAIK, regarding the "pinkish tint", Java saves the JPEG as ARGB (still with transparency information). Most viewers, when opening, assume the four channels must correspond to a CMYK (not ARGB) and thus the red tint.
If you import the image back to Java, the transparency is still there, though.
I had the same issue in OpenJDK 7 and I managed to get around this exception by using an imageType
of TYPE_3BYTE_BGR
instead of TYPE_4BYTE_ABGR
using the same OpenJDK.
2019 answer: Make sure your BufferedImage does not have alpha transparency. JPEG does not support alpha, so if your image has alpha then ImageIO cannot write it to JPEG.
Use the following code to ensure your image does not have alpha transparancy:
static BufferedImage ensureOpaque(BufferedImage bi) {
if (bi.getTransparency() == BufferedImage.OPAQUE)
return bi;
int w = bi.getWidth();
int h = bi.getHeight();
int[] pixels = new int[w * h];
bi.getRGB(0, 0, w, h, pixels, 0, w);
BufferedImage bi2 = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
bi2.setRGB(0, 0, w, h, pixels, 0, w);
return bi2;
}
Here is some code to illustrate @Thunder idea to change the image type to TYPE_3BYTE_BGR
try {
BufferedImage input = ImageIO.read(new File("input.png"));
System.out.println("input image type=" + input.getType());
int width = input.getWidth();
int height = input.getHeight();
BufferedImage output = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
int px[] = new int[width * height];
input.getRGB(0, 0, width, height, px, 0, width);
output.setRGB(0, 0, width, height, px, 0, width);
ImageIO.write(output, "jpg", new File("output.jpg"));
} catch (Exception e) {
e.printStackTrace();
}