2012-11-16 144 views
3

我正在寻找一种方法来绘制一个带有灰度颜色的Java中的PNG图像(带有Alpha通道),然后覆盖一个透明颜色,例如Green 75%的不透明度,最重要的是改变颜色。 要清楚,最终的图像将直接导致在其上方放置透明颜色,并且不会是任何特殊类型混合的结果。上的图像的顶部在Alpha通道上叠加一个透明颜色的PNG

然后叠加RGB颜色(102,255,0,阿尔法)::

例如,我会得出以下图像

在图像上绘制颜色的方法必须是这样的,它不会干扰屏幕上靠近的其他图像。这将与Adobe Photoshop的颜色叠加功能类似。两幅图像可以有不同的颜色叠加层,但单独的叠加层不会与彼此相冲突。

感谢leonbloy,我相信使用“SRC_OVER”的AlphaComposit可以解决这个问题,然后我可以使用一种方法将结果保存为一个新的BufferedImage,这将防止叠加层影响屏幕上的任何其他图像对象。

我会发布结果,因为我测试这个。

+0

不清楚你想要做什么,也没有尝试过什么。你在使用BufferedImage吗?你读过 - 是 - [这](http://stackoverflow.com/questions/2318020/merging-two-images)?你想根据顶部图像的透明度来做一个“正常”的覆盖,或者你是想实现一个特殊的混合/覆盖?你看过[AlphaComposite](http://docs.oracle.com/javase/1.5.0/docs/api/java/awt/AlphaComposite.html)吗? – leonbloy

+1

我的歉意,我会尽量更清楚。我的意图是按照透明度进行正常叠加。我不以任何方式混合。我并不知道AlphaComposite类,因为我是Java中2D图形编程的新手,在我的初始搜索中没有找到。我查看了AlphaComposite上的[this](http://docs.oracle.com/javase/tutorial/2d/advanced/compositing.html)页面,看起来好像“SOURCE_OVER”是我正在使用的。 – ubertastic

+1

好的,如果你解决了你的问题,你总是可以自己添加你的解决方案作为答案并接受它。顺便说一句,这与PNG没有特别的关系,我删除了这个标签。 – leonbloy

回答

5

我能够使用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); 
} 
相关问题