【发布时间】:2015-09-20 19:12:29
【问题描述】:
我打算制作一个彩色叠加层来覆盖我所在城市的地图。但是我希望叠加层只是半透明的。
我知道 rgba 值以及 a 值如何决定透明度,但是在使用 BufferedImage 类时,我只能将一种颜色分配给一个像素。假设您获得了两个相同大小的图像。我将如何将一个覆盖在另一个之上,而覆盖层的不透明度只有原始图像的一半。
【问题讨论】:
-
请接受或解释原因。
我打算制作一个彩色叠加层来覆盖我所在城市的地图。但是我希望叠加层只是半透明的。
我知道 rgba 值以及 a 值如何决定透明度,但是在使用 BufferedImage 类时,我只能将一种颜色分配给一个像素。假设您获得了两个相同大小的图像。我将如何将一个覆盖在另一个之上,而覆盖层的不透明度只有原始图像的一半。
【问题讨论】:
像这样修改 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;
}
【讨论】: