2012-05-23 75 views
10

我有一個BufferedImage i,我想從那image一定像素包括阿爾法值得到Color。像素是使用xy座標值確定。bufferedImage.getRGB(X,Y)不會產生阿爾法

這裏是我的嘗試:

Color c = new Color(i.getRGB(x, y)); 

出於某種原因,新的顏色對象包含了正確的RGB但阿爾法丟失。

我在做什麼錯?

在此先感謝

+1

我不是很確定這個類是如何工作的,但是你使用的是一個名爲'getRGB'的函數,然後你驚訝它只能得到RGB? – murgatroid99

+0

是的,這是真的,但我以前檢查過像素是否包含使用getRGB()方法的任何alpha值。 http://stackoverflow.com/questions/10419838/how-can-i-find-out-where-a-bufferedimage-has-alpha-in-java – Rapti

+0

我明白了。 「阿爾法迷失」是什麼意思? – murgatroid99

回答

17

單參數的構造函數Color你使用丟棄alpha信息。使用兩參數版本而不是和在true通作hasalpha

Color c = new Color(i.getRGB(x, y), true); 

相關Javadoc

Color(int rgb)

創建一種不透明的sRGB顏色與由所述指定的組合後的RGB值紅色成分在16-23位,8-15位表示綠色分量,0-7位表示藍色分量。

Color(int rgba, boolean hasalpha)

創建具有在24-31位,16-23位表示紅色分量,8-15位表示綠色分量,並且由阿爾法分量的指定的組合RGBA值的sRGB顏色位0-7中的藍色分量。

+0

完美的作品,謝謝! – Rapti

+0

很好的解釋! –

5

阿爾法不會丟失。

您必須使用接受像素信息的(int,boolean)構造函數,並指定它是否具有帶有布爾值或帶有4個值(紅色,綠色,藍色和Alpha的構造函數的alpha值。

JavaDoc

的(INT,INT,INT,int)構造信息要縮短代碼,你可以隨時與 Color color = new Color(i.getRGB(x, y), true); 告訴顏色構造的像素信息不替換所有下面的代碼包含Alpha值。

的(INT,布爾)構造從JavaDoc

注意,有時獲取阿爾法的信息時,按以下方式可能會返回-1,在這種情況下,這意味着它返回到255,所以你必須執行256 1來獲得實際的alpha值。這段代碼演示瞭如何加載圖像,並獲得一定的座標是圖像的顏色,在這種情況下,0,0。下面的例子可以告訴你如何檢索每個顏色值,包括α,並重建一個新的色彩。

import java.awt.Color; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 

import javax.imageio.ImageIO; 

public class main { 

    public static void main(String [] args){ 
     BufferedImage image = null; 
     try { 
      image = ImageIO.read(new URL("image.png")); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     int pixel = image.getRGB(0, 0); 

     int alpha = (pixel >> 24) & 0xff; 
     int red = (pixel >> 16) & 0xff; 
     int green = (pixel >> 8) & 0xff; 
     int blue = (pixel >> 0) & 0xff; 

     Color color1 = new Color(red, green, blue, alpha); 

     //Or use 
     Color color2 = new Color(image .getRGB(0, 0), true); 

    } 
    } 

BufferedImages的getRGB(INT,INT)JavaDoc,你可以看到,因爲它說:

Returns an integer pixel in the default RGB color model (TYPE_INT_ARGB) and default sRGB colorspace. Color conversion takes place if this default model does not match the image ColorModel. There are only 8-bits of precision for each color component in the returned data when using this method.

這意味着阿爾法值也被檢索。