2011-05-30 49 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