ImageIO not able to write a JPEG file

后端 未结 5 1579
萌比男神i
萌比男神i 2020-12-01 06:16

I have a BufferedImage I\'m trying to write to a jpeg file, but my Java program throws an exception. I\'m able to successfully save the same buffer to a gif and png. I\'ve t

相关标签:
5条回答
  • 2020-12-01 06:26

    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;
    }
    
    0 讨论(0)
  • 2020-12-01 06:28

    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.

    0 讨论(0)
  • 2020-12-01 06:30

    You get the same error

    Caused by: javax.imageio.IIOException: Invalid argument to native writeImage
    at com.sun.imageio.plugins.jpeg.JPEGImageWriter.writeImage(Native Method)
    at com.sun.imageio.plugins.jpeg.JPEGImageWriter.writeOnThread(JPEGImageWriter.java:1055)
    

    if you are using a not supported Color Space (in my case CYMK). See How to convert from CMYK to RGB in Java correctly? how to solve this.

    0 讨论(0)
  • 2020-12-01 06:34

    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();
    }
    
    0 讨论(0)
  • 2020-12-01 06:36

    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.

    0 讨论(0)
提交回复
热议问题