setRGB和imageIO.write之后意外的像素值发生了变化

时间:2014-09-22 20:17:19

标签: java rgb pixels

我需要从我生成的值中写出灰色图像。这是我使用的一段代码,但我简单。

BufferedImage test = new BufferedImage(1,1,BufferedImage.TYPE_BYTE_GRAY);
int rgb =(3 & 0xff) << 16 | (3 & 0xff) << 8 | (3 & 0xff);
test.setRGB(0, 0, rgb);
ImageIO.write(test, "png", new File("/home/harris/cipher.png"));

此代码将生成一个像素的图像。像素值应为3,但我得到0。这段代码有什么问题?

1 个答案:

答案 0 :(得分:1)

这里有几件事情要发生。首先,您尝试为1字节像素设置3字节颜色。像素的颜色深度由TYPE_BYTE_GRAY指示。如果您使用TYPE_INT_RGB,代码将按照书面形式工作,但不会产生灰度图像。

如果你真的想要一个灰度图像,那么你应该保留TYPE_BYTE_GRAY。但是,您无法将像素操作为RGB,因此您可以提取WriteableRaster并按如下方式操作:

WritableRaster raster = test.getRaster();

int [] gray = new int[1];
gray[0] = 3;
raster.setPixel(0, 0, gray);

当编码为PNG时,此示例实际上产生像素值2.将上面的值设置为4会产生3的像素值。但是,当将其编码为BMP时,颜色按预期编写。我不是PNG专家,但也许这是某种图像优化?