2010-02-23 201 views
72

我需要在Java中合并两个图像(BufferedImage)。如果没有透明度,这不会成为问题。基本图像已经有一些透明度。我想保持原样,并为其添加“蒙版”,即第二张图片。这第二个图像没有不透明的像素,实际上它几乎是完全透明的,只是有一些透明度较低的像素来提供某种“光效”,如反射。重要的细节:我不想在屏幕上使用图形来做到这一点,我需要通过合并合并来获得BufferedImage。合并两个图像

任何人都可以帮助我吗? 谢谢!

详情:合并两张图片保持透明度。这是我需要做的。

注意:这Set BufferedImage alpha mask in Java没有做我所需要的,因为它不能很好地处理两张图像具有透明度 - 它会修改第一张图片的透明度。

回答

155

只需创建一个具有透明度的新BufferedImage,然后在其上绘制其他两个图像(具有完全或半透明)。 这是怎么看起来像:

Image plus overlay

示例代码(图像被称为 'image.png' 和 'overlay.png'):

File path = ... // base path of the images 

// load source images 
BufferedImage image = ImageIO.read(new File(path, "image.png")); 
BufferedImage overlay = ImageIO.read(new File(path, "overlay.png")); 

// create the new image, canvas size is the max. of both image sizes 
int w = Math.max(image.getWidth(), overlay.getWidth()); 
int h = Math.max(image.getHeight(), overlay.getHeight()); 
BufferedImage combined = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); 

// paint both images, preserving the alpha channels 
Graphics g = combined.getGraphics(); 
g.drawImage(image, 0, 0, null); 
g.drawImage(overlay, 0, 0, null); 

// Save as new image 
ImageIO.write(combined, "PNG", new File(path, "combined.png")); 
+0

有没有办法有第二图像在第一个中心? – Ahmed 2013-01-14 19:03:09

+3

不应该调用g.dispose();最后? – 2013-08-11 23:20:01

+0

嗨,我遵循这种方法,并保存只有第二个图像,但不是第一个图像...任何帮助在这里将不胜感激.. – 2015-04-23 15:34:27

2

我不能给你一个具体的答案,但java.awt.AlphaComposite这里是你的朋友。您将完全控制两幅图像如何合并。然而,使用它并不简单 - 你首先需要学习一些图形理论。

2

不知道更多关于你想要达到的效果,我只想指出你也可以直接绘制到BufferedImage上。所以你可以在屏幕上做任何事情,你可以在图像上自己做。

所以,如果你想要的是一个绘制在另一个之上,那真的很容易。只需抓住基础图像的图形对象,并将其他图形拖到它上面。

再一次,取决于你正在做的确切的效果,可能无法正常工作。更多细节可以提供更好的帮助。例如,这是AlphaComposite的一项工作,如其他响应者提及的或自定义ImageOp(或现有ImageOps的某种组合)。