【发布时间】:2020-05-04 15:41:53
【问题描述】:
我正在尝试将 24 位 RGB 格式的灰度图像转换为 8 位格式的灰度图像。换句话说,输入和输出在视觉上应该是相同的,只是通道的数量发生了变化。这是输入图像:
用于将其转换为 8 位的代码:
File input = new File("input.jpg");
File output = new File("output.jpg");
// Read 24-bit RGB input JPEG.
BufferedImage rgbImage = ImageIO.read(input);
int w = rgbImage.getWidth();
int h = rgbImage.getHeight();
// Create 8-bit gray output image from input.
BufferedImage grayImage = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY);
int[] rgbArray = rgbImage.getRGB(0, 0, w, h, null, 0, w);
grayImage.setRGB(0, 0, w, h, rgbArray, 0, w);
// Save output.
ImageIO.write(grayImage, "jpg", output);
这是输出图像:
如您所见,略有不同。但它们应该是相同的。对于那些看不到它的人,这里是the difference between the two images(在 Gimp 中使用差异混合模式查看时,全黑表示没有差异)。如果我使用 PNG 代替输入和输出,也会出现同样的问题。
在完成grayImage.setRGB 之后,我尝试比较两个图像中相同像素的颜色值:
int color1 = rgbImage.getRGB(230, 150); // This returns 0xFF6D6D6D.
int color2 = grayImage.getRGB(230, 150); // This also returns 0xFF6D6D6D.
两者颜色相同。但是,如果我与 Gimp 中的图像进行相同的比较,我会分别得到 0xFF6D6D6D 和 0xFF272727... 巨大的差异。
这里发生了什么?有什么方法可以从灰度 24 位图像中获得相同的 8 位图像?我正在使用 Oracle JDK 1.8 作为记录。
【问题讨论】:
标签: java jpeg bufferedimage javax.imageio color-channel