2010-02-23 391 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的某種組合)。