BufferedImage & createScreenCapture создает неправильные цвета
В моей 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;
}
Для целей тестирования я создал чисто розовую картинку (RGB(255,0555)). Проблема в том, что даже если пиксель чисто розовый, функция возвращает что-то вроде RGB(250,61,223), а также тестирует переменные красного, зеленого и синего цветов. Кроме того, сохраненный файл (myScreenShot.bmp) выглядит совсем по-другому.
Что я делаю неправильно. Может ли это быть как-то связано с ColorModel?
UPD: получение DataBuffer из bi, похоже, не дает правильных результатов - первый элемент созданного DataBuffer равен "-2105371". Я не знаю, откуда появился знак минус, но если я преобразую его в HEX, я получу что-то вроде "FFFFFFFFFFDFDFE5". Реальный пиксель RGB - это (E5,E5,EB), а буфер уже поврежден, вместо него используется RGB(DF,DF,E5). Это сводит меня с ума уже.
1 ответ
Скорее всего, из-за цветовой модели.
Согласно этому коду он использует 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);