2013-04-22 137 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)); 
...