需求:通过url数组下载图片,再竖直合成一张新的图片,具体java代码如下
1 /**
2 * 竖直合并图片
3 *
4 * @param urls
5 * @return
6 */
7 public static byte[] mergePic(String urls[]) {
8 //BufferedImage转byte数组的格式
9 String imgFormat = "jpg";
10 //最终图片宽、高,所有图片中最宽
11 int desWidth = 0, desHeight = 0, maxWidth = 0;
12 byte[] ret = null;
13 //图片集合
14 List<BufferedImage> images = new ArrayList<BufferedImage>();
15 //新图片
16 BufferedImage desImage = null;
17 //下载图片
18 for (String url : urls) {
19 BufferedImage image = downloadPic(url);
20 if (image != null) {
21 images.add(image);
22 }
23 }
24 //没有图片返回null
25 if (images.size() < 1) {
26 return ret;
27 }
28 //合并图片
29 //计算合成的图片长高
30 for (BufferedImage img : images) {
31 desWidth = img.getWidth();
32 //获取最宽的图片
33 if (desWidth > maxWidth) {
34 maxWidth = desWidth;
35 }
36 desHeight += img.getHeight();
37 }
38 desWidth = maxWidth;
39 //创建新图片
40 desImage = new BufferedImage(desWidth, desHeight, BufferedImage.TYPE_INT_RGB);
41 //合并子图到新图片
42 //像素点起始x,y坐标
43 int w_x = 0, h_y = 0;
44 for (BufferedImage img : images) {
45 int width = img.getWidth();
46 int height = img.getHeight();
47 //从子图片中读取rgb
48 int[] rgbArr = new int[width * height];
49 rgbArr = img.getRGB(0, 0, width, height, rgbArr, 0, width);
50 //开始竖直方向合并
51 desImage.setRGB(0, h_y, width, height, rgbArr, 0, width);
52 //更新像素点起始x,y坐标
53 w_x += width;
54 h_y += height;
55
56 }
57 //BufferedImage转Byte数组,默认jpg
58 ret = BufferedImage2Byte(desImage, imgFormat);
59 return ret;
60 }
61
62 /**
63 * 通过url下载图片,返回BufferedImage
64 *
65 * @param url
66 * @return
67 * @throws FileNotFoundException
68 *
69 */
70 public static BufferedImage downloadPic(String url) {
71 try {
72 Connection conn = Jsoup.connect(url);
73 conn.method(Connection.Method.GET).timeout(10 * 1000).ignoreContentType(true);
74 Response res = HttpUtil.request(conn, 3, 1 * 1000);
75 byte[] body = res.bodyAsBytes();
76 ByteArrayInputStream in = new ByteArrayInputStream(body);
77 BufferedImage image = ImageIO.read(in); //将in作为输入流,读取图片存入image
78 return image;
79 } catch (IOException ex) {
80 java.util.logging.Logger.getLogger(PicUtil.class.getName()).log(Level.SEVERE, null, ex);
81 return null;
82 }
83 }
84
85 /**
86 * 将BufferedImage转化为byte数组
87 *
88 * @param bImage
89 * @param format 图片格式"png,jpeg,gif等"
90 * @return
91 */
92 public static byte[] BufferedImage2Byte(BufferedImage bImage, String format) {
93 byte[] ret = null;
94 ByteArrayOutputStream out = new ByteArrayOutputStream();
95 try {
96 ImageIO.write(bImage, format, out);
97 ret = out.toByteArray();
98 } catch (IOException ex) {
99 java.util.logging.Logger.getLogger(PicUtil.class.getName()).log(Level.SEVERE, null, ex);
100 return ret;
101 }
102 return ret;
103 }
参考博客: