2011-05-30 50 views

回答

4

我不認爲有一個方法調用來做到這一點;您將不得不獲取所有圖像數據並遮蓋每個像素的alpha字節。例如,使用getRGB()來獲取圖像的ARGB像素。最重要的字節是阿爾法值。所以你從getRGB()獲得陣列中的每個像素,

int alpha = (pixel >> 24) & 0xFF; 
+0

好的,謝謝。我如何屏蔽掉一個像素的alpha字節? – clamp 2011-05-30 12:59:26

+0

增加了一些細節。 – 2011-05-30 13:06:34

+0

我認爲這是可能的,沒有手動循環的像素可能導致更好的性能在某些平臺上,看到我的答案。 – Waldheinz 2011-05-30 13:11:17

3

你可以grab the Raster從BufferedImage中,然後create a child這一個只包含你感興趣(該bandList參數)樂隊的光柵。從這個子柵格中,您可以創建一個new BufferedImage,並帶有一個合適的ColorModel,它只包含灰度aplpha掩碼。

這樣做而不是手動迭代像素的好處是,運行時有機會了解您正在做什麼,因此可以通過利用硬件功能加速此。老實說,我懷疑它會加速與目前的JVM,但誰知道未來會帶來什麼?

5

未經測試,但包含要點。

public Image alpha2gray(BufferedImage src) { 

    if (src.getType() != BufferedImage.TYPE_INT_ARGB) 
     throw new RuntimeException("Wrong image type."); 

    int w = src.getWidth(); 
    int h = src.getHeight(); 

    int[] srcBuffer = src.getData().getPixels(0, 0, w, h, (int[]) null); 
    int[] dstBuffer = new int[w * h]; 

    for (int i=0; i<w*h; i++) { 
     int a = (srcBuffer[i] >> 24) & 0xff; 
     dstBuffer[i] = a | a << 8 | a << 16; 
    } 

    return Toolkit.getDefaultToolkit().createImage(new MemoryImageSource(w, h, pix, 0, w)); 
} 
+0

我認爲工作中的轉變需要轉向另一種方式? 'a |一個<< 8 | a << 16' – 2015-03-31 17:56:33

+0

@AustinHyde先生,這是絕對正確的。 – vbence 2015-03-31 18:20:16

+0

這不會編譯。 Line to fix: 'int [] srcBuffer = src.getData()。getPixels(0,0,w,h,(int [])null);' – 2017-02-21 18:08:15