Как замаскировать цветные каналы в Java? - PullRequest
2 голосов
/ 08 января 2012

Я пытаюсь написать код, который маскирует красный и синий канал из введенного изображения. Я получил значения R, G, B, но, тем не менее, застрял в дальнейшей работе. Может ли кто-нибудь помочь мне в этом, пожалуйста?

public class Green {

    public static void main(String args[]) throws IOException {

        BufferedImage bi = ImageIO.read(new File("image.jpg"));

        for (int x = 0; x <= bi.getWidth(); x++) {
            for (int y = 0; y <= bi.getHeight(); y++) {
                int pixelCol = bi.getRGB(x, y);
                int r = (pixelCol >> 16) & 0xff;
                int b = pixelCol & 0xff;
                int g = (pixelCol >> 8) & 0xff;
                int px = 0;
                px = (px | (g << 8));
                bi.setRGB(x, y, px);
            }
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 08 января 2012

Некоторые замечания:

  • Используйте IDE (интегрированную среду разработки), например Eclipse или NetBeans.
  • Используйте < вместо <= в качестве условия в циклах for.
  • Использовать форматирование кода (это особенность IDE)
  • Для наглядности, порядок r, g и b.

    int r = (color >> 16) & 0xff;
    int g = (color >> 8) & 0xff;
    int b = (color >> 0) & 0xff;
    
  • Поскольку вы сказали, что застряли, остается только сохранить обработанное изображение:

    ImageIO.write(bi, "JPG", new File("green.jpg"));
    
  • Небольшой трюк для быстрого выполнения маскиэто:

    bi.setRGB(x, y, bi.getRGB(x, y) & 0xff00ff00);
    

Итак, рабочий код должен быть таким:

public class Green
{
    public static void main(String args[]) throws IOException
    {     
        /* Read the image */
        BufferedImage bi= ImageIO.read(new File("image.jpg"));   

        /* Loop through all the pixels */   
        for (int x=0; x < bi.getWidth(); x++)
        {          
            for (int y = 0; y < bi.getHeight(); y++)
            {   
                /* Apply the green mask */                      
                bi.setRGB(x, y, bi.getRGB(x, y) & 0xff00ff00);
            }
        }

        /* Save the image */
        ImageIO.write(bi, "JPG", new File("green_mask.jpg"));
    }
}
0 голосов
/ 08 января 2012

В дополнение к копированию и масштабированию изображений, Java 2D API также фильтрует изображение.Фильтрация - это рисование или создание нового изображения путем применения алгоритма к пикселям исходного изображения.

Фильтры изображений можно применять с помощью следующего метода:

void Graphics2D.drawImage(BufferedImage img,
                      BufferedImageOp op,
                      int x, int y)

Параметр BufferedImageOp реализует фильтр.

См. Этот документ для изображенияпримеры фильтров: http://ptgmedia.pearsoncmg.com/images/9780132413930/samplechapter/0132413930_CH08.pdf

...