2011-07-20 50 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。这样布局经理就可以完成定位和绘画图像的所有工作。

相关问题