【问题标题】:Removing transparency in PNG BufferedImage删除 PNG BufferedImage 中的透明度
【发布时间】:2015-01-11 04:14:10
【问题描述】:

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

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

显示后有黑色背景,据我所知是PNG透明造成的。

我找到了解决这个问题的方法,建议使用BufferedImage.TYPE_INT_RGB,但是我不确定如何将它应用到我上面的代码中。

【问题讨论】:

    标签: java png bufferedimage


    【解决方案1】:

    创建第二个BufferedImage,类型为TYPE_INT_RGB...

    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();
    

    您现在有一个非透明版本的图像...

    要保存图片,请查看Writing/Saving an Image

    【讨论】:

    • 我需要将图像绘制到整个矩形,所以基本上完​​全填充了它。语法略有不同:g2d.drawImage(img, 0, 0, copy.getWidth(), copy.getHeight(), null);
    • @JanPetzold 解决方案将取决于要求,我个人使用“缩放填充”方法来保持原始图像的纵横比for example。在大多数情况下,内置的缩放算法更注重速度而不是质量,所以你应该警惕这一点
    • 这仍然会将原始源图像混合到copy ,因此您为fillRect 选择的任何背景颜色都将在任何不完全不透明的像素上部分可见。是否有一种标准方法可以完全忽略 alpha 混合,并假设所有源像素完全不透明?
    • 简短回答是否定的。长答案是,你尝试不同的阿尔法混合
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多