2015-10-06 48 views
1

我有一種方法來更改Java中BufferedImage的Alpha值。這是我的代碼:Java BufferedImage:Alpha變更使低阿爾法區域顯示爲黑色

public static void setAlpha(BufferedImage img, byte alpha) { 
    alpha %= 0xff; 
    for (int cx=0;cx<img.getWidth();cx++) { 
     for (int cy=0;cy<img.getHeight();cy++) { 
      int color = img.getRGB(cx, cy); 
      color &= 0x00ffffff; 
      color |= (alpha << 24); 
      img.setRGB(cx, cy, color); 
     } 
    } 
} 

當我使用這個功能已經透明圖像的所有區域之前變成黑色。爲什麼?

編輯:

非常感謝您的幫助。現在我明白了,問題是什麼。這是我的工作職能:

public static void changeAlpha(BufferedImage img, float alphaPercent) { 
    for (int cx=0;cx<img.getWidth();cx++) { 
     for (int cy=0;cy<img.getHeight();cy++) { 
      int color = img.getRGB(cx, cy); 
      byte alpha = (byte) (color >> 24); 
      alpha = (byte) ((float) (int) (alpha & 0xff) * alphaPercent); 
      color &= 0x00ffffff; 
      color |= ((alpha & 0xff) << 24); 
      img.setRGB(cx, cy, color); 
     } 
    } 
} 
+0

......瘋狂的猜測:因爲'set ** RGB **'只設置紅色,綠色和藍色? – usr2564301

+1

@Jongware可能是錯誤的命名,但沒有。所有'get/setRGB'方法都在sRGB色彩空間中的32位ARGB值上工作。 – haraldK

+0

你的'BufferedImage'是什麼類型? – haraldK

回答

1

聲明

alpha %= 0xff; 

似乎有點奇怪。如果Java byte已簽名(範圍[-128 ... 127]),則永遠不會更改alpha(對於字節範圍中的任何值,x%255 = x)。

但是,您希望alpha在範圍[0 ... 255]內。通常,您使用&運算符來執行此操作。但只是改變運營商將不會這樣做,因爲你存儲的值在byte,這將強制值再次進入範圍[-128 ... 127] ...

而是,嘗試(在你的循環):

color |= ((alpha & 0xff) << 24); 

或者,你可以寫這樣的:

int alphaValue = alpha & 0xff; 
for (...) { 
    for (...) { 
     // Inside the loop: 
     color |= (alphaValue << 24); 
    } 
} 

最後,關於透明度的說明。如果您以前的像素以前是100%透明的,則該像素中的顏色無關緊要。出於這個原因,它可能會被標準化爲黑色(所有0 s)以提高效率。可能無法恢復原始顏色。