去除 PNG BufferedImage 中的透明度

7
我正在使用以下代码读取PNG图像:

BufferedImage img = ImageIO.read(new URL(url));

在显示它时,出现了黑色背景,我知道这是由于PNG透明度引起的。
我找到了解决这个问题的方法,建议使用BufferedImage.TYPE_INT_RGB,但我不确定如何将其应用到上面的代码中。
1个回答

30
创建一个类型为TYPE_INT_RGB的第二个BufferedImage...
BufferedImage copy = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_RGB);

将原始的涂到复制品上...

Graphics2D g2d = copy.createGraphics();
g2d.setColor(Color.WHITE); // Or what ever fill color you want...
g2d.fillRect(0, 0, copy.getWidth(), copy.getHeight());
g2d.drawImage(img, 0, 0, null);
g2d.dispose();

现在您有了一张非透明版本的图片...

要保存这张图片,请查看编写/保存图像


我需要将图像绘制到整个矩形中,基本上是完全填充它。语法略有不同:g2d.drawImage(img, 0, 0, copy.getWidth(), copy.getHeight(), null); - Jan Petzold
@JanPetzold 解决方案取决于要求,个人而言,我使用“填充缩放”方法来保持原始图像的纵横比,例如。在大多数情况下,内置的缩放算法注重速度而非质量,因此您应该注意这一点。 - MadProgrammer
这仍然将原始源图像混合到“copy”上,因此您为“fillRect”选择的任何背景颜色都将部分可见于任何不完全不透明的像素上。是否有一种标准方法可以完全忽略alpha混合,并假定所有源像素都是完全不透明的? - MasterHD
简短的回答是否定的。长的回答是,你可以尝试不同的 alpha 混合。 - MadProgrammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接