2014-11-23 50 views
0

我有一个JavaBufferedImage。前景是黑色,背景是透明的。我想将图像重新着色为红色。如何更改Java缓冲图像的颜色

我已阅读其他人的帖子,并尝试使用此代码,但是当我运行它时,我的图像完全透明。

有没有人有任何想法?我是Java 2D图像处理库的新手。谢谢。

imageIcon= new ImageIcon(getImageURL("/ImagesGun/GunBase.png")); 
    gunBaseImage= Utilities.toBufferedImage(imageIcon.getImage()); 

    int red = 0x00ff0000; 
    int green = 0x0000ff00; 
    int blue = 0x000000ff; 

    int width = gunBaseImage.getWidth(); 
    int height = gunBaseImage.getHeight(); 

    //Loop through the image and set the color to red 
    for(int x = 0; x < width; x++){ 
     for(int y = 0; y < height; y++){ 
      long pixel = gunBaseImage.getRGB(x, y); 
      if(pixel != 0){ 
       red = 0x00ff0000; 

       gunBaseImage.setRGB(x,y,red); 
      } 

     } 
    } 
+0

为每个像素调用getRGB和setRGB会变得很慢,因为这些方法试图进行全色空间转换。对于图像处理,最好访问BufferedImage后面的int数组。 – lbalazscs 2014-11-24 06:54:14

回答

3

您正在使用完全透明的红色值。颜色定义中的第一个条目是alpha值。如果你想要一个完全不透明的颜色,你需要使用ff作为第一个值。因此你的红色应该是0xffff0000,你的绿色0xff00ff00等等。这也意味着黑色是ff000000。

+0

这是真的。我认为,如果他想保持不透明性,他必须掩盖这一点,并处理颜色本身的价值,这意味着他需要改变他的'if(pixel!= 0)'检查,对吧?然后,在他的if()块中,他需要进行按位AND操作,将原始不透明度添加到他想要的颜色。 – hfontanez 2014-11-23 16:12:34

+0

我的想法正是@hfontanez。这就是为什么我提到不透明的黑色是0xff000000,所以他可以做'if(pixel!= 0xff000000)'。 – 2014-11-23 16:14:32

+0

工作正常!谢谢@Matthew !!! – user1104028 2014-11-24 04:34:48