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);
Другие вопросы по тегам