Java:从BufferedImage中提取Alpha通道

时间:2011-05-30 12:56:38

标签: java alpha

我想从缓冲图像中提取Alpha通道,并使用灰度将其绘制在单独的图像中。 (就像它在photoshop中显示一样)

3 个答案:

答案 0 :(得分: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));
}

答案 1 :(得分:4)

我不相信有一个方法调用来做到这一点;您必须获取所有图像数据并屏蔽每个像素的字母字节。例如,使用getRGB()获取图像的ARGB像素。最重要的字节是alpha值。因此,对于数组中的每个像素,您都可以从getRGB()获得

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

答案 2 :(得分:3)

你可以从BufferedImage中grab the Raster,然后create a child这个只包含你感兴趣的乐队的光栅(bandList参数)。从这个子栅格中,您可以使用合适的ColorModel创建new BufferedImage,其中只包含灰度aplpha蒙版。

以这种方式执行此操作而不是手动迭代像素的好处是运行时有机会了解您正在做什么,因此通过利用硬件可以加速 能力。老实说,我怀疑现在的JVM会加速,但谁知道未来会带来什么?

相关问题