Как эффективно раскрасить пиксели в BufferedImage? - PullRequest
2 голосов
/ 01 июня 2010

Я использую следующий фрагмент кода, чтобы перебрать все пиксели в изображении и нарисовать красный квадрат 1x1 над пикселями, которые находятся в пределах определенного допуска RGB. Я думаю, есть более эффективный способ сделать это? Любые идеи приветствуются. (bi - это BufferedImage, а g2 - это Graphics2D, цвет которого установлен на Color.RED).

    Color targetColor = new Color(selectedRGB);

    for (int x = 0; x < bi.getWidth(); x++) {
        for (int y = 0; y < bi.getHeight(); y++) {
            Color pixelColor = new Color(bi.getRGB(x, y));
            if (withinTolerance(pixelColor, targetColor)) {
                g2.drawRect(x, y, 1, 1);
            }
        }
    }

private boolean withinTolerance(Color pixelColor, Color targetColor) {
    int pixelRed = pixelColor.getRed();
    int pixelGreen = pixelColor.getGreen();
    int pixelBlue = pixelColor.getBlue();

    int targetRed = targetColor.getRed();
    int targetGreen = targetColor.getGreen();
    int targetBlue = targetColor.getBlue();

    return (((pixelRed >= targetRed - tolRed) && (pixelRed <= targetRed + tolRed)) &&
            ((pixelGreen >= targetGreen - tolGreen) && (pixelGreen <= targetGreen + tolGreen)) &&
            ((pixelBlue >= targetBlue - tolBlue) && (pixelBlue <= targetBlue + tolBlue)));
}

1 Ответ

1 голос
/ 01 июня 2010
if (withinTolerance(pixelColor, targetColor)) {
    bi.setRGB( x, y, 0xFFFF0000 )
}
Третий параметр метода

BufferedImage * setRGB, как описано в Javadoc, принимает пиксель формы TYPE_INT_ARGB.

  • 8 битов для альфы (FF здесь, полностью непрозрачный)
  • 8 бит для красного компонента (здесь FF, полностью красный)
  • 8 бит для зеленого компонента (0, зеленого нет)
  • 8 бит для синего компонента.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...