2013-04-22 156 views
2

我试图制作一个简单的程序,用于加载图像,使其成为蓝色效果,并使其成为半透明的。我通过在图像像素上运行并更改RGB的蓝色值和alpha值来完成此操作。我成功地为图像创造了一种不错的蓝色效果。但我无法设法改变图像不透明度。似乎无论如何改变像素的alpha值,都不会影响图像。在RGBA中使用alpha制作图像的不透明度

这里是我的代码:

try { 
    image1 = ImageIO.read(new File("image1.png")); 
} catch(IOException e) {e.printStackTrace();} 


for(int x=0;x<image1.getWidth();x++) { 
    for(int y=0;y<image1.getHeight();y++) { 
     int rgb = image1.getRGB(x, y); 
     Color color = new Color(rgb); 
     int r = color.getRed(); 
     int g = color.getGreen(); 
     int b = color.getBlue(); 
     int a = color.getAlpha(); 

     System.out.println(a); 
     a= 100; 
     if(b<155) 
      b+=100; 
     else 
      b=255; 

     color = new Color(r,g,b,a); 

     image1.setRGB(x, y, color.getRGB()); 
    } 
} 

更新: 我也尝试过这一点。仍然不能正常工作:

for(int x=0;x<image1.getWidth();x++) { 
    for(int y=0;y<image1.getHeight();y++) { 
     int rgb = image1.getRGB(x, y); 
     Color color = new Color(rgb,true); 
     int r = color.getRed(); 
     int g = color.getGreen(); 
     int b = color.getBlue(); 
     int a = color.getAlpha(); 

     a= 100; 
     if(b<155) 
      b+=100; 
     else 
      b=255; 


     rgb = rgb | b; 
     rgb = rgb & 0x33ffffff; 


     image1.setRGB(x, y, rgb); 
    } 
} 
+0

你能告诉您可以使用它定义图像1的代码? – 2013-04-22 20:48:37

+0

我编辑代码 – Shelef 2013-04-22 20:51:22

回答

0

Color构造函数只有一个int创建一个不透明的颜色(与阿尔法255)。当您再次使用getAlpha()取出alpha时,此处始终为255。

相关的Java代码Color,来自管线413(至少在Java中1.7):

public Color(int rgb) { 
    value = 0xff000000 | rgb; 
} 

最显著8个字节被设置,并覆盖任何阿尔法分量在那里。

要保留alpha分量,则需要使用接受的价值观int一个boolean对于它是否有alpha分量Color constructor

Color color = new Color(rgb, true); 
+0

所以这个构造函数的含义是什么:Color(r,g,b,a);我什么时候需要使用它? – Shelef 2013-04-22 20:53:10

+0

需要4个整数的Color构造函数 - 单个组件的红色,绿色,蓝色和alpha,从0到255。这不会与带有4个浮点数的构造函数相混淆 - 单个元素为红色,绿色,蓝色和alpha,它们的小数位数为0.0到1.0。 – rgettman 2013-04-22 20:56:09

+0

是setRGB在幕后使用的颜色吗?我更新了代码,但仍然无效。我无法理解如何使用您的代码。因为Im只使用Color来将rbg int分解为它的部分,并且无法计算出Color对象如何直接影响我的图像 – Shelef 2013-04-22 21:19:47

1

使用的AlphaComposite

BufferedImage img = //some code here 
BufferedImage imgClone = //some clone of img, but let its type be BufferedImage.TYPE_INT_ARGB 
Graphics2D imgCloneG = imgClone.createGraphics(); 
imgCloneG.setComposite(AlphaComposite.getInstance(AlphaComposite.DST_IN, 0.5f)); 
imgCloneG.drawImage(img, 0, 0, null); 
//imgClone is now img at half alpha 

imgClone可以这样进行:

... 
imgClone = new BufferedImage(img.getWidth(), img.getHeight(), 
          BufferedImage.TYPE_INT_ARGB); 
Graphics2D imgCloneG = imgClone.createGraphics(); 
imgCloneG.drawImage(img, 0, 0, null); 
imgCloneG.setComposite(AlphaComposite.getInstance(AlphaComposite.DST_IN, 0.5f)); 
... 
相关问题