功能
竖向合成多张大小不一致的图片,以最宽图片的为宽为合成后的宽度, 高为所有图片的总高度.图片宽度没有达到合成的宽度则填充部分使用白色画布填充.
代码
/*** 多张图片进行竖向合并成一张图片* @param imageFiles 图片文件* @param dstPath 合成图片路径* @param hasLine 是否标识合成分割线* @return*/public static boolean mergeImages(List<File> imageFiles, String dstPath, boolean hasLine) {try {Integer allWidth = 0;Integer allHeight = 0;List<BufferedImage> imgs = new ArrayList<>();for(int i = 0; i < imageFiles.size(); i++){imgs.add(ImageIO.read(imageFiles.get(i)));//取宽数据if (allWidth < imgs.get(i).getWidth()) {allWidth = imgs.get(i).getWidth();}allHeight += imgs.get(i).getHeight();}BufferedImage combined = new BufferedImage(allWidth, allHeight, BufferedImage.TYPE_INT_RGB);Graphics2D g = combined.createGraphics();g.setColor(Color.WHITE);g.fillRect(0, 0, allWidth, allHeight);// 竖向合成Integer height = 0;for(int i = 0; i < imgs.size(); i++){g.drawImage(imgs.get(i), 0, height, null);height += imgs.get(i).getHeight();if (hasLine && i != imgs.size() - 1) {g.setColor(Color.RED);//line需要占用一个像素,所以height-1才能保证不被后续的image覆盖BasicStroke stroke = new BasicStroke(2.5f, BasicStroke.CAP_BUTT,BasicStroke.JOIN_ROUND, 3.5f, new float[] { 10, 5 }, 0f);g.setStroke(stroke);g.drawLine(0, height - 1, allWidth, height - 1);}}ImageIO.write(combined, "jpg", new File(dstPath));System.out.println("===合成成功====");} catch (Exception e) {System.out.println("===合成失败====");System.out.println(StringUtil.exceptionToString(e));return false;}return true;}
测试效果: