来自java BufferedImage的奇怪RGB值getRGB()

时间:2015-09-27 05:05:34

标签: java image-processing colors

我试图从灰度图像中获取RGB值,并返回错误的(?)RGB值。这是代码。

Color color = new Color(image.getRGB(0, 0));
System.out.print(color.getRed());
System.out.print(color.getGreen());
System.out.print(color.getBlue());

在颜色选择器使用时,第一个像素RGB值R:153,G:153,B:153,但我的代码打印

203203203

为什么会发生这件事?而且,我试图使用MATLAB灰度值确切的像素也是153.我这样做错了吗?

这是图像

enter image description here

2 个答案:

答案 0 :(得分:5)

这是因为image.getRGB(x, y)按定义返回 sRGB色彩空间中的ARGB值。

来自JavaDoc

  

返回默认RGB颜色模型(TYPE_INT_ARGB)和默认sRGB颜色空间中的整数像素。如果此默认模型与图像ColorModel不匹配,则会进行颜色转换。

Matlab和其他工具可能使用线性RGB或灰色空间,这就是值不同的原因。

如果图像是灰度(TYPE_BYTE_GRAY),您可以通过访问Raster及其getDataElements方法从Java获取相同的值。

Object pixel = raster.getDataElements(0, 0, null); // x, y, data array (initialized if null)

如果图片为TYPE_BYTE_GRAYpixel将是一个包含单个元素的byte数组。

int grayValue = ((byte[]) pixel)[0] & 0xff;

在您的情况下,此值为153

答案 1 :(得分:3)

试试这个

System.out.println(image.getRaster().getSample(0, 0, 0));  //R
System.out.println(image.getRaster().getSample(0, 0, 1));  //G
System.out.println(image.getRaster().getSample(0, 0, 2));  //B

此处

getSample(int x, int y, int b)
将位于(x,y)的像素的指定波段中的样本作为int返回。 [根据this]

<强>参数:
x - 像素位置的X坐标
y - 像素位置的Y坐标
b - 要返回的波段b = [0,1,2],[R,G,B]

并查看BufferedImage getRGB vs Raster getSample