Java ImageIO在需要黑色的地方写入teal

Java ImageIO在需要黑色的地方写入teal,java,image,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 IOEx

我编写了以下简单代码,将一个小的全黑图像写入磁盘:

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());
    }
}
如我所料

但是,图像文件似乎是一个小的teal正方形,而不是一个小的黑色正方形,如图所示

这是在Windows10和Java版本1.8.0_92Java热点上运行的。我之前在Linux机器上看到了类似的结果

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


如果我改变像素=0x00_00_00_00;然后我得到一个黑色的正方形。这无疑是一个线索,但我还没有理解。我做错了什么?如何修复它?

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

ImageIO.write(img, "png", file);
经过一些搜索,看起来像ImageIO中的bug

或者说到底不是虫子?请看这里:
评论说,ARGB for JPG被解读为CMYK。

在等待答案时,我尝试了PNG和GIF,发现两者在颜色方面都能正常工作——尽管在实际应用程序中会创建更大的文件。然而,您链接的问题似乎指向读而不是写中的错误。我没有读,虽然看起来它们确实有某种关联。@砖检查编辑-如果保存到jpg文件,看起来它只是作为CMYK而不是RGB值。是的,那里的注释实际上说://陷阱:在jpeg文件中,4个通道将被解释为CMYK。。。这是不好的,这仍然是写而不是读。另一个答案上的注释表明这是Java中的一个bug。读写之间肯定是对称错误,所以我想我被卡住了。。知道它在CMYK治疗是很方便的——即使它不应该这样做!据我所知,记录的行为是API在幕后进行颜色模型转换。@Brick,可能存在实际错误。@K_7我喜欢在我的原始帖子中重复这个可能的错误,并解释了为什么我的问题不同。
ImageIO.write(img, "png", file);