在我的Java程序中,我需要分析给定坐标中像素的颜色。由于我需要经常这样做,首先我捕获屏幕的一部分,然后获得像素颜色。我这样做:
BufferedImage bi = robot.createScreenCapture(new Rectangle(0,0,100,100));
...
pxcolor = GetPixelColor(bi,x,y);
...
ImageIO.write(bi, "bmp", new File("myScreenShot.bmp"));
GetPixelColor功能非常明显:
public Color GetPixelColor(BufferedImage b, int x, int y)
{
int pc = b.getRGB(x, y);
Color ccc = new Color(pc,true);
int red = (pc & 0x00ff0000) >> 16; // for testing
int green = (pc & 0x0000ff00) >> 8; // for testing
int blue = pc & 0x000000ff; // for testing
return ccc;
}
出于测试目的,我创建了一个pure pink picture(RGB(255,0,255))。问题是 即使像素是纯粉红色,该函数也会返回RGB(250,61,223)以及红色,绿色和蓝色等变量。此外,保存的文件(myScreenShot.bmp)looks quite different。
我做错了什么。它可能与ColorModel有关吗?
UPD:从bi获取DataBuffer似乎没有产生正确的结果 - 生成的DataBuffer的第一个元素等于“-2105371”。我不知道从哪里来减号,但如果我把它变成HEX我会得到类似“FFFFFFFFFFDFDFE5”的东西。真实像素RGB是(E5,E5,EB),缓冲区已经损坏,而是RGB(DF,DF,E5)。这让我疯了。
答案 0 :(得分:1)
很可能是由于颜色模型。
根据this code,无论您的屏幕颜色深浅如何,它都会使用DirectColorModel
(见下文)。
/*
* Fix for 4285201
* Create a DirectColorModel equivalent to the default RGB ColorModel,
* except with no Alpha component.
*/
screenCapCM = new DirectColorModel(24,
/* red mask */ 0x00FF0000,
/* green mask */ 0x0000FF00,
/* blue mask */ 0x000000FF);