功能
竖向合成多张大小不一致的图片,以最宽图片的为宽为合成后的宽度, 高为所有图片的总高度.图片宽度没有达到合成的宽度则填充部分使用白色画布填充.
代码
/**
* 多张图片进行竖向合并成一张图片
* @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;
}
测试效果: