图像透明度如何工作以及如何实现它?

How does image transparency work and how do I implement it?

我打算制作一个彩色叠加层来覆盖我所在城市的地图。但是我希望覆盖层只是半透明的。

我知道 rgba 值以及 a 值如何决定透明度,但是在使用 BufferedImage class 时,我只能为一个像素分配一种颜色。假设您有两张相同大小的图像。我将如何将一个覆盖在另一个上,覆盖层的不透明度仅为原始图像的一半。

像这样修改 alpha 通道(不透明度从 0 到 255):

BufferedImage changeOpacity(BufferedImage img, int opacity) {
    final BufferedImage ret = new BufferedImage(img.getWidth(),
                                                img.getHeight(),
                                                BufferedImage.TYPE_INT_ARGB);
    final RescaleOp ro = new RescaleOp(new float[] {1f, 1f, 1f, ((float)opacity)/255f},
                                       new float[] {0f, 0f, 0f, 0f},
                                       null);
    ro.filter(img, ret);
    return ret;
}

然后像这样用 alpha 通道叠加两个图像:

BufferedImage overlay(BufferedImage img1, BufferedImage img2) {
    final BufferedImage combined = new BufferedImage(img1.getWidth(),
                                                     img1.getHeight(),
                                                     BufferedImage.TYPE_INT_ARGB);
    final Graphics g = combined.getGraphics();
    g.drawImage(img1, 0, 0, null);
    g.drawImage(img2, 0, 0, null);
    return combined;
}