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

来自java BuffereImage getRGB()的奇怪RGB值,java,image-processing,colors,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 为什么会发

我试图从灰度图像中获取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。我做错了吗

这就是图像

试试这个

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(intx,inty,intb)将位于(x,y)的像素在指定频带内的样本作为int返回。[根据

参数:
x-像素位置的x坐标
y-像素位置的y坐标
b-返回[R,G,b]
b=[0,1,2]的频带


再看看这是因为
image.getRGB(x,y)
根据定义返回sRGB颜色空间中的ARGB值

从:

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

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

如果图像为灰度(
TYPE\u BYTE\u gray
),可以通过访问
Raster
及其
getDataElements
方法从Java获得相同的值

Object pixel = raster.getDataElements(0, 0, null); // x, y, data array (initialized if null)
如果图像是
TYPE\u BYTE\u GRAY
像素
将是带有单个元素的
字节
数组

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

在您的情况下,此值将为
153

@FastSnail这是我的灰度图像,我看到一个编辑建议,建议添加import java.awt.image.WritableRaster.getRaster()是BuffereImage类中的一个公共方法,它返回一个可写的光栅对象。为什么建议编辑?您能再解释一下吗?@HawasKaPujaariSir,我可以问您为什么我们最后需要0xff掩码吗?我意识到没有它,会出现一个完全不同的值…@Peter,因为byte在Java中是有符号的类型,我们需要一个无符号的价值
int grayValue = ((byte[]) pixel)[0] & 0xff;