图像透明度如何工作以及如何实现它?
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;
}
我打算制作一个彩色叠加层来覆盖我所在城市的地图。但是我希望覆盖层只是半透明的。
我知道 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;
}