我这个答案已经太晚了,但也许它对某人有用。这是迈克尔·迈尔斯方法的更简单、更有效的版本:
public void applyGrayscaleMaskToAlpha(BufferedImage image, BufferedImage mask)
{
int width = image.getWidth();
int height = image.getHeight();
int[] imagePixels = image.getRGB(0, 0, width, height, null, 0, width);
int[] maskPixels = mask.getRGB(0, 0, width, height, null, 0, width);
for (int i = 0; i < imagePixels.length; i++)
{
int color = imagePixels[i] & 0x00ffffff; // Mask preexisting alpha
int alpha = maskPixels[i] << 24; // Shift blue to alpha
imagePixels[i] = color | alpha;
}
image.setRGB(0, 0, width, height, imagePixels, 0, width);
}
它一开始就将所有像素读入一个数组,因此只需要一个 for 循环。此外,它直接将蓝色字节转移到(蒙版颜色的)alpha,而不是先屏蔽红色字节然后再移动它。
与其他方法一样,它假设两个图像具有相同的尺寸。