合并两个图像

2022-08-31 11:19:46

我需要在Java中合并两个图像(BufferedImage)。如果没有透明度,那将不是问题。基本图像已经具有一定的透明度。我想保持原样,并对其应用“遮罩”,即第二个图像。这第二幅图像没有不透明的像素,实际上它几乎完全透明,只是有一些不太透明的像素来提供某种“光效”,比如反射。重要细节:我不想在屏幕上执行此操作,对于图形,我需要获得带有结果合并的缓冲图像。

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

详细信息:合并两个图像以保持透明度。这就是我需要做的。

注意:Java中的这个Set BufferedImage alpha掩码不能做我需要的,因为它不能很好地处理具有透明度的两个图像 - 它修改了第一个图像透明度。


答案 1

只需创建一个具有透明度的新 BufferedImage,然后在其上绘制其他两个图像(具有全透明度或半透明度)。这是它的外观:

Image plus overlay

示例代码(图像称为“图像.png”和“覆盖.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);

g.dispose();

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

答案 2

我不能给你一个具体的答案,但java.awt.AlphaComposite在这里是你的朋友。您将绝对控制两个图像的合并方式。然而,它不是直接使用 - 你需要先学习一些图形理论。


推荐