java多张图片合成

以下代码可直接使用,欢迎大家一起交流。

package com.util;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.alibaba.fastjson.JSON;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
 * 说明:
 * 	  如果想直接使用,文件的命名需以李xxx-4xxxx-0.png格式,也可以自己定义并修改代码。
 * @author lvgb
 *
 */
public class ImageTest {
	/**
	 * 合成前图片存放目录
	 */
	private static final String SOURCE = "D:\\test\\999\\";
	/**
	 * 合成后图片存放目录
	 */
	private static final String TARGET = "D:\\test\\888\\";
	
	public ImageTest() {
	}

	public static void main(String[] args) {
		try {
			File[] files = new File(SOURCE).listFiles();
			Set<String> successSet = new HashSet<String>();
			Set<String> failSet = new HashSet<String>();
			// 先清空目标文件夹里面的内容
			//FileUtils.cleanDirectory(new File(TARGET));
			//将相同图片的名称存入集合
			for (File file : files) {
				String fileName = file.getName();
				String name = fileName.substring(0, fileName.lastIndexOf("-"));
				successSet.add(name); 
			}
			//遍历集合,将需要合成的图片存入list
			for (String next : successSet) {
				try {
					List<String> list = new ArrayList<String>();
					int sum = 0;
					System.out.println(next);
					for (int i = 0;i<files.length ; i++) {
						String fileName = files[i].getName();
						String names = fileName.substring(0, fileName.lastIndexOf("-"));
						if(next.equals(names)){
							list.add(SOURCE + next + "-" + sum + ".png");
							sum ++;
						}
					}
					//调用方法生成图片
					imageJion(list,TARGET + next + ".png");
				} catch (Exception e) {
					e.printStackTrace();
					failSet.add(next);
				}
			}
			if(failSet.size() > 0){
				System.out.println("失败------" + JSON.toJSONString(failSet));
			}else {
				System.out.println("全部成功--------------");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 图片合成
	 * list 传图片全路径
	 * @throws Exception
	 */
	public static void imageJion(List<String> list,String outPath) throws Exception {
		int width = 0;
		int totalHeight = 0;
		for (int i = 0; i < list.size(); i++) {
			File _file1 = new File(list.get(i));
			Image src1 = javax.imageio.ImageIO.read(_file1);
			// 获取图片的宽度
			if (i == 0) {
				width = src1.getWidth(null);
			}
			// 将图片的高度相加
			totalHeight = totalHeight + src1.getHeight(null);
		}
		// 构造一个类型为预定义图像类型之一的 BufferedImage。 宽度为第一只的宽度,高度为各个图片高度之和
		BufferedImage tag = new BufferedImage(width, totalHeight, BufferedImage.TYPE_INT_RGB);
		// 绘制合成图像
		Graphics g = tag.createGraphics();
		int heightThree = 0;
		for (int i = 0; i < list.size(); i++) {
			File _file1 = new File(list.get(i));
			Image src1 = javax.imageio.ImageIO.read(_file1);
			int height = src1.getHeight(null);
			// 绘制合成图像
			if (i == 0) {
				heightThree = height;
				g.drawImage(src1, 0, 0, width, height, null);
			} else {
				g.drawImage(src1, 0, heightThree, width, height, null);
				heightThree = heightThree + height;
			}
		}
		// 释放此图形的上下文以及它使用的所有系统资源。
		g.dispose();
		// 创建输出流
		FileOutputStream out = new FileOutputStream(outPath);
		// 将绘制的图像生成至输出流
		JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
		encoder.encode(tag);
		// 关闭输出流
		out.close();
		System.out.println(outPath + "成功------");

	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值