在带有alpha通道的PNG图像上叠加一个透明颜色。

4
我正在寻找一种在Java中绘制灰度PNG图像(具有Alpha通道),然后叠加一个透明颜色,例如75%不透明的绿色,来改变颜色的方法。 需要明确的是,最终图像将直接通过覆盖顶部的透明颜色而获得,而不是任何特殊类型的混合结果。 例如,我将绘制以下图像: 然后在图像上叠加RGB颜色(102、255、0、alpha): 叠加颜色的方法需要不会干扰屏幕上其他靠近它的图像。这类似于Adobe Photoshop的叠加颜色功能。两个图像可以有单独的颜色叠加效果,但是这两个单独的叠加效果不会相互冲突。
感谢leonbloy,我相信使用“SRC_OVER”的AlphaComposit可以解决这个问题,然后我可以使用一种保存结果并生成新的BufferedImage的方法,这将防止叠加影响屏幕上的其他图像对象。
我会在测试后发布结果。

你想做什么并不清楚,也不知道你尝试过什么。你是否使用BufferedImage?你读过这个链接了吗?你想根据顶部图像的透明度进行“普通”叠加,还是你正在尝试实现特殊的混合/叠加效果?你看过AlphaComposite了吗? - leonbloy
1
非常抱歉,我会尽力更清楚地表达。我的意图是按照透明度进行普通的覆盖。我不想以任何方式混合。由于我是Java 2D图形编程的新手,并且在最初的搜索中没有找到这个类,所以我不知道AlphaComposite类。我查看了关于AlphaComposite的页面,似乎“SOURCE_OVER”是我要使用的内容。 - ubertastic
1
好的,如果你解决了你的问题,你可以将你的解决方案作为答案添加并接受它。顺便说一下,这与PNG没有特别关系,我已经移除了那个标签。 - leonbloy
1个回答

6
我使用AlphaComposite、Graphics2D和BufferedImage实现了所需的效果。
@Override
public void paintComponent(Graphics g) {
    BufferedImage result = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    Graphics2D gbi = result.createGraphics();
    BufferedImage x = null;
    try {
        x = ImageIO.read(getClass().getResource("/resources/someimage.png"));
    } catch (IOException ex) {
        Logger.getLogger(CanvasPanel.class.getName()).log(Level.SEVERE, null, ex);
    }
    gbi.drawImage(x, 0, 0, this);
    gbi.setColor(selectedColor);
    gbi.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.75f));
    gbi.fillRect(0, 0, width, height);
    g.drawImage(result, 0, 0, this);
}

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