【发布时间】:2011-05-30 12:56:38
【问题描述】:
我想从缓冲图像中提取 Alpha 通道,并使用灰度将其绘制在单独的图像中。 (就像它在 Photoshop 中显示的一样)
【问题讨论】:
我想从缓冲图像中提取 Alpha 通道,并使用灰度将其绘制在单独的图像中。 (就像它在 Photoshop 中显示的一样)
【问题讨论】:
未测试,但包含要点。
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));
}
【讨论】:
a | a << 8 | a << 16
int[] srcBuffer = src.getData().getPixels(0, 0, w, h, (int[]) null);
我不相信有一个方法调用可以做到这一点;您必须获取所有图像数据并屏蔽每个像素的 alpha 字节。例如,使用getRGB() 来获取图像的 ARGB 像素。最高有效字节是 alpha 值。所以对于你从getRGB()得到的数组中的每个像素,
int alpha = (pixel >> 24) & 0xFF;
【讨论】:
您可以从 BufferedImage 中 grab the Raster,然后 create a child 这个仅包含您感兴趣的波段的栅格(bandList 参数)。从此子栅格中,您可以使用合适的 ColorModel 创建一个 new BufferedImage,它只包含灰度 aplpha 蒙版。
这样做而不是手动迭代像素的好处是运行时有机会了解您在做什么,因此可能可以通过利用硬件来加速能力。老实说,我怀疑当前的 JVM 会加速它,但谁知道未来会发生什么?
【讨论】: