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