加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 02:26:29 所属栏目:Java 来源:网络整理
导读:在我的 Java程序中,我需要分析给定坐标中像素的颜色.由于我需要经常这样做,首先我捕获屏幕的一部分,然后获得像素颜色.我这样做: BufferedImage bi = robot.createScreenCapture(new Rectangle(0,100,100));...pxcolor = GetPixelColor(bi,x,y);...ImageIO.w
在我的 Java程序中,我需要分析给定坐标中像素的颜色.由于我需要经常这样做,首先我捕获屏幕的一部分,然后获得像素颜色.我这样做:

BufferedImage bi = robot.createScreenCapture(new Rectangle(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,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).这让我疯了.

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读