BufferedImage& createScreenCapture产生错误的颜色

时间:2011-06-29 10:55:50

标签: java bufferedimage

在我的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)。这让我疯了。

1 个答案:

答案 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);