2011-07-20 102 views
1

我試圖將幾個圖像合併爲一個使用Java的較大圖像。傳入的圖像的高度都是127×寬度293.這個想法是,一些圖像被傳遞給該方法,該方法獲取圖像並將它們構建到另一個更大的圖像中。對於較大圖像將會有一個佈局,其中總共12個可能的圖像可以輸入到較大的圖像,均勻間隔(2行6個圖像,沒有重疊)。如果傳入的圖像少於12張,則只有第一張圖像會填充很多空白,其餘圖像將爲白色,因爲背景將變爲白色。當我運行該程序時,它將打印較大的圖像,但只會填充顯示左上方第一個圖像的第一個空間,而不管有多少圖像被傳入。此外,背景是粉紅色,而不是預期的白色背景。我只是一個初學Java的人,所以我正在努力解決這些學習中的一些難題。有關我如何能夠解決我的問題的任何建議? (代碼複製如下以供參考)謝謝!Java將多個圖像合併爲一個不會重疊的較大圖像

public class ImagesCombine { 

public String BuildImgs (File[] imgs)throws IOException { 
    int arsize = imgs.length; 
    File path = new File("Z:/JAVAFiles/Images/"); 
    BufferedImage page = new BufferedImage(620,900,BufferedImage.TYPE_INT_ARGB); 
    Graphics2D paint; 
    paint = page.createGraphics(); 
    paint.setPaint(Color.WHITE); 
    paint.fillRect (0, 0, page.getWidth(), page.getHeight()); 
    paint.setBackground(Color.WHITE); 
    String tmpname = ""; 

    for (int i=0;i<imgs.length;i++){ 

     if(i==0){ 
      Image img0 = ImageIO.read(new File(path, imgs[i].getName())); 
      paint.drawImage(img0,0,0,null); 
      paint.dispose(); 
      } 
     if(i==1){ 
      Image img1 = ImageIO.read(new File(path, imgs[i].getName())); 
      paint.drawImage(img1,323,0,null); 
      paint.dispose(); 
      } 
     if(i==2){ 
      Image img2 = ImageIO.read(new File(path, imgs[i].getName())); 
      paint.drawImage(img2,0,142,null); 
      paint.dispose(); 
      } 
     if(i==3){ 
      BufferedImage img3 = ImageIO.read(new File(path, imgs[i].getName())); 
      paint.drawImage(img3,323,142,null); 
      paint.dispose(); 
      } 
     if(i==4){ 
      BufferedImage img4 = ImageIO.read(new File(path, imgs[i].getName())); 
      paint.drawImage(img4,0,284,null); 
      paint.dispose(); 
      } 
     if(i==5){ 
      BufferedImage img5 = ImageIO.read(new File(path, imgs[i].getName())); 
      paint.drawImage(img5,323,284,null); 
      paint.dispose(); 
      } 
     if(i==6){ 
      BufferedImage img6 = ImageIO.read(new File(path, imgs[i].getName())); 
      paint.drawImage(img6,0,426,null); 
      paint.dispose(); 
      } 
     if(i==7){ 
      BufferedImage img7 = ImageIO.read(new File(path, imgs[i].getName())); 
      paint.drawImage(img7,323,426,null); 
      paint.dispose(); 
      } 
     if(i==8){ 
      BufferedImage img8 = ImageIO.read(new File(path, imgs[i].getName())); 
      paint.drawImage(img8,0,568,null); 
      paint.dispose(); 
      } 
     if(i==9){ 
      BufferedImage img9 = ImageIO.read(new File(path, imgs[i].getName())); 
      paint.drawImage(img9,323,568,null); 
      paint.dispose(); 
      } 
     if(i==10){ 
      BufferedImage img10 = ImageIO.read(new File(path, imgs[i].getName())); 
      paint.drawImage(img10,0,710,null); 
      paint.dispose(); 
      } 
     if(i==11){ 
      BufferedImage img11 = ImageIO.read(new File(path, imgs[i].getName())); 
      paint.drawImage(img11,323,710,null); 
      paint.dispose(); 
      } 

     } 
    String outpath = "Z:\\JAVAFiles\\" + imgs[0].getName().substring(0,16) + ".jpg"; 

    OutputStream outfile = new FileOutputStream(outpath); 

    JPEGImageEncoder encoder2 = JPEGCodec.createJPEGEncoder(outfile); 
    encoder2.encode(page); 
    outfile.close(); 
    return("Success"); 
} 
} 
+0

我注意到你在前三張圖像中使用了類型圖像,但是對所有其他圖像使用了bufferedimage類型。這是否完成了一個特定的原因? –

回答

2

我注意到的第一件事是,你每個圖像戰平後呼籲的Graphics2D dispose()。這可能就是爲什麼你只能看到一幅圖像在較大的圖像中繪製。取出該呼叫並放置在循環之後,您應該開始看到更多圖像。

作爲一個側面說明,可以簡化您的for循環了很多:

int width = 293; 
int height = 127; 
for (int i=0; i < Math.min(imgs.length, 12); i++){ 
    Image image = ImageIO.read(new File(path, imgs[i].getName())); 
    int row = i/6; // This will truncate to 0 or 1. 
    int column = i % 6; // Mod will produce the remainder of i/6 in the range 0-5 
    paint.drawImage(image, column * width, row * height, null); 
} 
+0

我擺脫了dispose(),但仍然只獲得左上角的一個圖像(我的佈局中的第一個位置)。對於循環來說,這是非常好的建議。我知道有一種方法可以簡化它,只是不能說出我的腦子。謝謝! – tab2006

+0

當您運行此方法時,是否收到任何異常?你可以用'ImageIO.write(page,「JPG」,new File(outpath))來嘗試另一種方式來保存圖像;' – Kainsin

0

要調用Dispose方法裏面一個for循環程序完成代碼的第一次運行,所以當環內它然後擺脫繪畫對象。當第二次瀏覽循環時,程序無法找到繪畫對象,因此它既不能繪製下一個圖像,也不能填充白色的房間。

嘗試在關閉for循環後立即使用dispose方法。

您也可以嘗試添加一些println方法來查看imgs項目返回的長度。你通常應該檢查你在循環中使用的變量中的數字,看看你是否得到你想要的。

+0

我已經設法讓圖像全部顯示出來。感謝所有幫助過的人!我現在只是處理圖像背景的顏色是粉紅色。 – tab2006

0

創建一個使用GridLayout的面板?然後,您可以將12個JLabel添加到面板,每個標籤都包含一個ImageIcon。這樣佈局經理就可以完成定位和繪畫圖像的所有工作。

相關問題