如何在Java中将多张图片垂直拼接为一张图片
解决图片垂直合并的问题
嘿,我看你这段代码的逻辑是按横向排列+自动换行来写的,这自然达不到你要的垂直堆叠效果~ 咱们来调整一下思路,核心要做这两件事:
- 先算出最终合成图的尺寸:宽度取所有图片里最宽的那个,高度是所有图片高度的总和(如果需要间距可以额外加)
- 绘制时固定x坐标为0,每次绘制完一张图就把y坐标往下移对应图片的高度
修正后的代码示例
import javax.imageio.ImageIO; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.List; public class ImageVerticalMerge { public static void main(String[] args) throws IOException { List<String> imgFiles = List.of("img1.jpg", "img2.png", "img3.bmp"); // 替换成你的图片路径列表 // 第一步:计算合成图的宽度和总高度 int maxWidth = 0; int totalHeight = 0; BufferedImage[] images = new BufferedImage[imgFiles.size()]; // 先加载所有图片,同时统计尺寸 for (int i = 0; i < imgFiles.size(); i++) { images[i] = ImageIO.read(new File(imgFiles.get(i))); maxWidth = Math.max(maxWidth, images[i].getWidth()); totalHeight += images[i].getHeight(); // 如果需要给图片之间加间距,比如10像素,就改成 totalHeight += images[i].getHeight() + 10; } // 第二步:创建合成图 BufferedImage result = new BufferedImage(maxWidth, totalHeight, BufferedImage.TYPE_INT_RGB); Graphics g = result.getGraphics(); // 第三步:垂直绘制所有图片 int currentY = 0; for (BufferedImage bi : images) { // 把图片绘制在当前Y位置,X设为0(如果要水平居中,可以改成 (maxWidth - bi.getWidth())/2) g.drawImage(bi, 0, currentY, null); currentY += bi.getHeight(); // 如果加了间距,这里也要同步:currentY += bi.getHeight() + 10; } // 释放资源并保存合成图 g.dispose(); ImageIO.write(result, "JPG", new File("merged_vertical.jpg")); } }
关键调整点说明
- 先预加载所有图片并统计尺寸:避免重复读取文件,同时确保合成图的尺寸完全适配
- 绘制时固定
x=0,每次更新currentY:保证图片从上到下垂直堆叠 - 可选优化:如果想要图片水平居中,把绘制的x坐标改成
(maxWidth - bi.getWidth())/2即可,这样窄图不会靠左对齐
内容的提问来源于stack exchange,提问作者Lez




