2013-02-02 48 views
0

我正在嘗試讀取2個圖像文件,然後將image2合併到image1頂部,但下面的代碼似乎不起作用。保存後,我只能將image1視爲原始圖片。 這兩個圖像都是PNG。Java:合併2個圖像不起作用

String url= uploadPath + filename; 
BufferedImage im = ImageIO.read(url); 
String url2= "image2.png"; 
BufferedImage im2 = ImageIO.read(url); 
Graphics2D g = im.createGraphics(); 
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.8f)); 
g.drawImage(im2, im.getWidth()/2, im.getHeight()/2, null); 
g.dispose(); 
ImageIO.write(im, "png", new File(url)); 

我在這裏錯過了什麼? 感謝

+0

爲了更快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

+0

有沒有例外拋出? – MadProgrammer

回答

3

我沒有問題得到它的工作。

我沒有找到這條線......

g.drawImage(im2, im.getWidth()/2, im.getHeight()/2, null); 

有點擔憂。如果圖像大小恰到好處,可以將圖像渲染到背景圖像的外部。您應該使用的座標是相對於主圖像...

public class MergeImages { 

    public static void main(String[] args) { 
     File inner = new File("Inner.png"); 
     File outter = new File("Outter.png"); 

     try { 

      BufferedImage biInner = ImageIO.read(inner); 
      BufferedImage biOutter = ImageIO.read(outter); 

      System.out.println(biInner); 
      System.out.println(biOutter); 

      Graphics2D g = biOutter.createGraphics(); 
      g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.8f)); 
      int x = (biOutter.getWidth() - biInner.getWidth())/2; 
      int y = (biOutter.getHeight() - biInner.getHeight())/2; 
      System.out.println(x + "x" + y); 
      g.drawImage(biInner, x, y, null); 
      g.dispose(); 

      ImageIO.write(biOutter, "PNG", new File("Outter.png")); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 
} 

我也確保你在同一文件中不讀兩次仔細檢查shuangwhywhy建議...我做一些事情時,測試代碼:P

+0

嗨,謝謝。它現在有效 – jeet

3

你的問題是im2是完全一樣im

BufferedImage im = ImageIO.read(url); 
BufferedImage im2 = ImageIO.read(url); 

我想這是一個錯字:它應該是url2而非url將被解讀爲im2,我說得對不對?

BufferedImage im2 = ImageIO.read(url2); 
+0

嗨,是的錯字,但仍然無法正常工作。它仍然保存image1原來的。 – jeet

+0

@jeet我同意MadProgrammer關於你從im的邊界中抽取im2的可能性的建議。順便說一句,你的兩幅圖像有多大? – shuangwhywhy

+0

如果您合併兩個相同的圖像,您可以期待哪個輸出? – h22

1

您還可以嘗試使用透明度爲0.5的SRC_ATOP。