ImageIO将青色写入黑色预期

时间:2017-05-10 20:44:22

标签: java image

我写了下面这个简单的代码来写一个小的,全黑的图像到磁盘:

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class ImageWriteTest {
    public static void main(String[] args) throws IOException {
        BufferedImage img = new BufferedImage(10, 10, BufferedImage.TYPE_INT_ARGB);
        final int PIXEL = 0xFF_00_00_00; // Black
        for(int i = 0; i < 10; ++i) {
            for(int j = 0; j < 10; ++j) {
                img.setRGB(i, j, PIXEL);
            }
         }

         ImageIO.write(img, "jpg", new File("/tmp/testImage.jpg"));

         int sample = img.getRGB(0,0);
         System.out.println((sample & 0x00_00_00_FF) + "\t" 
             + ((sample & 0x00_00_FF_00) >>> 8) + "\t" 
             + ((sample & 0x00_FF_00_00) >>> 16) + "\t"
             + ((sample & 0xFF_00_00_00) >>> 24));

         Color color = new Color(sample, true);
         System.out.println(color.getGreen() 
             + "\t" + color.getBlue() 
             + "\t" + color.getRed() 
             + "\t" + color.getAlpha());
    }
}

到终端的输出是两行

0    0    0   255
0    0    0   255

正如我所料。

然而,图像文件似乎是一个小的蓝绿色方块,而不是一个小的黑色方块,如图所示。

Output image from program

这是在Windows 10和Java版本1.8.0_92,Java HotSpot上运行的。我之前在Linux机器上看到了类似的结果。

我发现两个似乎有些相关的问题,但在这两种情况下,问题似乎是文件从外部源读入程序并且有额外的元数据和/或缺少标题。在这种情况下,我以编程方式创建了图像,因此我希望它能够正常工作。

如果我改变PIXEL = 0x00_00_00_00;,那么我会得到一个黑色方块。这无疑是一个线索,但我还没有理解。我做错了什么?我该如何解决?

1 个答案:

答案 0 :(得分:1)

我不是专家,但这是因为JPG不支持Alpha频道。将相同的结果更改为PNG,它将如您所愿。要做到这一点,只需使用

ImageIO.write(img, "png", file);

经过一些搜索,看起来像ImageIO中的错误 docs

或者也许不是bug?看看这里: jpeg image color gets drastically changed after just ImageIO.read() and ImageIO.write() 评论说,ARGB JPG被视为CMYK。