gpt4 book ai didi

java - BufferedImage 和 createScreenCapture 产生错误的颜色

转载 作者:搜寻专家 更新时间:2023-11-01 03:44:13 25 4
gpt4 key购买 nike

在我的 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”。我不知道减号是从哪里来的,但如果我将它转换为十六进制,我会得到类似“FFFFFFFFFFDFDFE5”的东西。真正的像素 RGB 是 (E5,E5,EB),缓冲区已经损坏,取而代之的是 RGB(DF,DF,E5)。这已经让我抓狂了。

最佳答案

这很可能是由于颜色模型。

根据 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);

关于java - BufferedImage 和 createScreenCapture 产生错误的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6519523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com