2012-01-08 1 views
2

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

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); 
      } 
     } 
    } 
} 
+0

Попробуйте использовать в форматировании IDE кода. Обычно он доступен с помощью Ctrl-Shift-F или Cmd-Shift-F для пользователей OSX. –

+1

В цикле for вы не должны использовать '<=', но '<'. Пример: когда у вас есть 4 элемента, они имеют индекс 0, 1, 2, 3. –

+1

И в чем вопрос? Чего вы хотите достичь? – Howard

ответ

3

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

  • использовать IDE (Integrated Development Environment), как Eclipse, или NetBeans.
  • Используйте < вместо <= как условие в ваших циклах.
  • Используйте форматирование кода (то есть особенность 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

В дополнении к копированию и масштабирование изображений, то 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