Java Преобразование ColorSpace BufferedImage в CS_GRAY без использования ConvertColorOp - PullRequest
2 голосов
/ 20 мая 2009

Я знаю, что можно конвертировать изображение в CS_GRAY, используя

public static BufferedImage getGrayBufferedImage(BufferedImage image) {
    BufferedImageOp op = new ColorConvertOp(ColorSpace
            .getInstance(ColorSpace.CS_GRAY), null);
    BufferedImage sourceImgGray = op.filter(image, null);

    return sourceImgGray;
}

однако, это критическая точка всей моей программы. Мне нужно делать это часто, на изображениях 800x600 пикселей, и для выполнения этой операции в среднем требуется около 200-300 мс. Я знаю, что могу сделать это намного быстрее, используя цикл for для циклического просмотра данных изображения и установки его сразу. Код выше с другой стороны создает новый BuxImage 800x600 с серой шкалой. Я предпочел бы просто преобразовать изображение, которое я передаю.

Кто-нибудь знает, как сделать это с помощью цикла for и учитывая, что изображение является цветовым пространством RGB?

Ответы [ 2 ]

3 голосов
/ 10 мая 2010

ColorConvertOp.filter принимает два параметра. Вторым параметром также является BufferedImage, который будет пунктом назначения. Если вы передадите правильный BufferedImage методу filter, это избавит вас от хлопот, чтобы создать новый BufferedImage.

1 голос
/ 10 июня 2014
private static int grayscale(int rgb) {
   int r = rgb >> 16 & 0xff;
   int g = rgb >> 8  & 0xff;
   int b = rgb       & 0xff;
   int cmax = Math.max(Math.max(r, g),b);
   return (rgb & 0xFF000000) | (cmax << 16) | (cmax << 8) | cmax;
}
public static BufferedImage grayscale(BufferedImage bi) {
    BufferedImage bout = new BufferedImage(bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_INT_ARGB);
    int[] rgbArray = new int[bi.getWidth() * bi.getHeight()];
    rgbArray = bi.getRGB(0, 0, bi.getWidth(), bi.getHeight(), rgbArray, 0, bi.getWidth());
    for (int i = 0, q = rgbArray.length; i < q; i++) {
        rgbArray[i] = grayscale(rgbArray[i]);
    }
    bout.setRGB(0, 0, bout.getWidth(), bout.getHeight(), rgbArray, 0, bout.getWidth());
    return bout;
}

Что бы вы ни делали, вы, вероятно, делаете что-то не так. Вы не должны восстанавливать буферизованное изображение снова и снова. Но, скорее, придумайте схему, чтобы просто обновить буферизованное изображение или взять исходные пиксели из оригинала и просто использовать шкалу серого, которая является максимумом компонентов RGB, в каждом из разделов.

...