Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用循环合并Java图像_Java - Fatal编程技术网

无法使用循环合并Java图像

无法使用循环合并Java图像,java,Java,我试图在下面的代码中合并图像,但最终的图像只有最后一个图像在输出中。 使用for循环,我尝试将多个图像添加到单个图像中。 请告知 package imageMerge; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.*; import javax.imageio.ImageIO; public class Merge { public static void main(St

我试图在下面的代码中合并图像,但最终的图像只有最后一个图像在输出中。 使用for循环,我尝试将多个图像添加到单个图像中。 请告知

package imageMerge;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.*;

import javax.imageio.ImageIO;

public class Merge {

    public static void main(String[] args) {
        final File folder = new File("images");
        Merge m=new Merge();
        m.processFiles(folder);
        


        
    }
    public void processFiles(final File folder) {
        String filename="";
        BufferedImage c=null;
        try {
            int i=1;
        for (final File fileEntry : folder.listFiles()) {
            if (fileEntry.isFile() && !fileEntry.getName().contains("final")) {
                filename=fileEntry.getName();
                c = new BufferedImage(5000, 5000, BufferedImage.TYPE_INT_ARGB);
                Graphics g = c.getGraphics();
                System.out.println(filename);
                    BufferedImage a = ImageIO.read(new File("D:\\images\\"+filename));
                    System.out.println(a.getHeight());
                    c.createGraphics().drawImage(a, 0, 0, null);
                    i+=1;
            }
        }
        ImageIO.write( c, "png", new File ( "D:\\images\\final.png" ));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

如评论所述,有几个问题:

  • 在循环中,每次迭代都要覆盖最终图像的内容,因此必须在循环之前声明一次最终图像的图形对象
  • 您正试图在相同的坐标(0,0)处写入每个图像。如果要垂直排列图像,请使用变量(
    yPosition
    此处)跟踪当前y位置
  • 您不必创建
    新文件
    文件条目
    已经是所需的
    文件
    对象
  • 总而言之:

    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.File;
    
    import javax.imageio.ImageIO;
    
    public class Merge {
    
        public static void main(final String[] args) {
            final File folder = new File("D:\\images");
            Merge m = new Merge();
            m.processFiles(folder);
    
        }
    
        public void processFiles(final File folder) {
            String filename = "";
    
            BufferedImage c = new BufferedImage(5000, 5000, BufferedImage.TYPE_INT_ARGB);
            Graphics g = c.createGraphics(); // 1)
    
            int yPosition = 0; // 2)
    
    
            try {
                int i = 1;
                for (final File fileEntry : folder.listFiles()) {
                    if (fileEntry.isFile() && !fileEntry.getName().contains("final")) {
                        filename = fileEntry.getName();
    
                        System.out.println(filename);
                        BufferedImage a = ImageIO.read(fileEntry); // 3)
                        System.out.println(a.getHeight());
                        g.drawImage(a, 0, yPosition, null); // 2)
    
    
                        yPosition = yPosition + a.getHeight(); // 2)
                        i += 1;
                    }
                }
                ImageIO.write(c, "png", new File("D:\\images\\final.png"));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    始终在同一位置绘制图像:0,0在循环的每次迭代中创建一个新的
    buffereImage
    ,覆盖上一个循环。你需要在循环之外创建它,并在每次迭代中向它添加图像。谢谢@NoeXWolf,我正在尝试一个接一个地垂直添加图像。你能帮我写代码吗?。我不知道如何为下一个项目的位置获得正确的x,y值谢谢你的代码。它可以工作,但图像不会一个接一个地出现。相反,它是相互叠加的。您是否添加了
    yPosition=yPosition+a.getHeight()?因为这应该可以解决问题。谢谢,我能够生成它。现在的问题是生成的最终图像看起来非常小,即使大小正确。有没有解决方法?运行此代码时,最终图像中的图像都保持了原始大小,可以尝试使用其他软件(例如Paint)打开图像。