2014-01-15 3 views
0

Теперь я могу применить пиксель другого изображения к пикселю исходного изображения от pg до m. но проблема в том, что я теряю эффект градиента или затухания.изменить цвет прозрачного пикселя в java

 public static void main(String[] args){ 
     try { 
      BufferedImage image = ImageIO.read(new File("c:\\m.png")); 
      BufferedImage patt = ImageIO.read(new File("c:\\pg.png")); 

      int f = 0; 
      int t = 0; 
      int n = 0; 
      BufferedImage bff = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB); 
      for (int y = 0; y < image.getHeight(); ++y) { 
       for (int x = 0; x < image.getWidth(); ++x) { 
        int argb = image.getRGB(x, y); 
        int nrg = patt.getRGB(x, y); 

        if(((argb>>24) & 0xff) == 0) { 
           bff.setRGB(x, y, (255<<24)); 
        } else { 
           bff.setRGB(x, y, nrg); 
        }        
       } 
      } 
      System.out.println("Trans : " + t + " Normal : " + n); 
      File outputfile = new File("c://imagetest.png"); 
      ImageIO.write(bff, "png", outputfile); 
     } catch (IOException ex) { 

     } 

} 

спасибо.

+0

Не изменяйте цвет ... измените трансперенсируемость – sanket

+0

Как изменить трансперенсируемость –

ответ

2

0xff000000 непрозрачный черный, 0x00000000 полностью прозрачный.

Что такое 0 (цвет, который вы выбрали)?

Да, это прозрачно.

Попробуйте 0xff000000 или еще лучше: argb^0xff000000, что просто изменяет прозрачность.

   if(((argb>>24) & 0xff) == 0) { 
          bff.setRGB(x, y, argb^0xff000000); 
       } else { 
          bff.setRGB(x, y, argb); 
       }        
+0

Да, теперь он работает, все прозрачные пиксели белые. –

0

Для BufferedImage.setRGB(int x, int y, int rgb) значение rgb производится следующим образом:

11111111 11111111 11111111 11111111 
Alpha Red  Green Blue

В своем коде вы проверить следующее:

if (((argb >> 24) & 0xff) == 0) 

который проверяет для значения альфа 0, таким образом, полностью прозрачный.

Когда вы находите, что это правда, то вы установите значение RGB в 0 с

bff.setRGB(x, y, 0); 

Таким образом, вы устанавливаете его в прозрачный снова.

Изменить что

bff.setRGB(x, y, (255<<24)); 

или

bff.setRGB(x, y, 0xff000000); //This should be better 

который изменит его непрозрачным черный пиксель. Это будет иметь двоичное значение

Edit:Moritz Petersen's solution должен работать лучше, так как она сохраняет цвет пикселя при удалении прозрачности.

Если вы хотите, чтобы установить его на определенный цвет, который вы могли бы сделать:

bff.setRGB(x, y, 0xffff0000); // red 
bff.setRGB(x, y, 0xff00ff00); // green 
bff.setRGB(x, y, 0xff0000ff); // blue 

или любое сочетание красного, зеленого и синего цветов.

+0

Это действительно полезно. –

+0

если я хочу добавить пиксель другого изображения к этому изображению, которое непрозрачно. –

+0

'bff.setRGB (x, y, argb^0xff000000);' (от Морица Петерсена). Причина, по которой вы теперь получаете все белое, состоит в том, что исходное изображение задало пиксели прозрачным белым. – ufis

Смежные вопросы