我写了下面这个简单的代码来写一个小的,全黑的图像到磁盘:
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
正如我所料。
然而,图像文件似乎是一个小的蓝绿色方块,而不是一个小的黑色方块,如图所示。
这是在Windows 10和Java版本1.8.0_92,Java HotSpot上运行的。我之前在Linux机器上看到了类似的结果。
我发现两个似乎有些相关的问题,但在这两种情况下,问题似乎是文件从外部源读入程序并且有额外的元数据和/或缺少标题。在这种情况下,我以编程方式创建了图像,因此我希望它能够正常工作。
如果我改变PIXEL = 0x00_00_00_00;
,那么我会得到一个黑色方块。这无疑是一个线索,但我还没有理解。我做错了什么?我该如何解决?
答案 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。