需求:通过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 }

参考博客:

[1] Java 实现图片拼接
[2] BufferedImage与byte[]互转

将几张图片合并为一张图片,返回byte数组的更多相关文章

  1. 用js两张图片合并成一张图片

    JS和canvas的合成方式 function drawAndShareImage(){ var canvas = document.createElement("canvas") ...

  2. HTML5利用canvas,把多张图合并成一张图片

    需求分析,根据当前网页中的几张图片,在手机上长按,保存图片到相册或者发送给好友. drawCanvas(){ var self = this; var imgsrcArray = [ require( ...

  3. java实现把两张图片合并(Graphics2D)

    package com.yin.text; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.i ...

  4. sqlserver 将多行数据查询合并为一条数据

    有这样一个需求:表T_FUN_TASK为任务表,有字段(TASKID,TASKNAME),表T_FUN_LOGBOOK为日志表,有字段(LOGID,TASKID,LOGDATE),一个任务可持续多天, ...

  5. Java中两个或多个byte数组合并及int类型转数组

    Java中两个或多个byte数组合并及int类型转数组 // 用list好处是可以未知多个? public static byte[] test(List<byte[]> values) ...

  6. go语言:多个[]byte数组合并成一个[]byte

    场景:在开发中,要将多个[]byte数组合并成一个[]byte,初步实现思路如下: 1.获取多个[]byte长度 2.构造一个二维码数组 3.循环将[]byte拷贝到二维数组中 package gst ...

  7. java 中byte[] 数组的合并

    因工作的需要,在从事 .Net 的开发中接触到了 Java, 虽然在大学的时候学过一段Java 编程,但并没有在实际的工作中使用过, Java 和 .Net的C#语法很相似,都是面向对象的,感觉在语法 ...

  8. 如何将多条update语句合并为一条

    需求: 如何将多条update语句合并为一条update语句:如,update table1 set col='2012' where id='2014001'      update table1  ...

  9. 将文件内容转化为byte数组返回

    如何将文件内容转化为byte数组并返回呢?对于这个问题,我献上我第一次成功的代码~ package com.succez.task1; import java.io.ByteArrayOutputSt ...

随机推荐

  1. excel VBA中正则模块vbscript.regexp的用法

    一.是一个对象,用于执行 正则表达式! 二.有三个属性:      1. Global属性: True or False, 指明模式是匹配整个字符串中所有与之相符的地方还是只匹配第一次出现的地方.默认 ...

  2. 基于 CentOS 8 搭建 openLDAP 服务器

    转载请注明原文地址:基于 CentOS 8 搭建 openLDAP 服务器 环境 OS: CentOS 8.4.2105 PHP: 7.4.21 注意 CentOS 7 中可能默认提供了 openLD ...

  3. Integer Inquiry 大数加法

    Integer Inquiry 1 import java.util.*; 2 import java.math.*; 3 import java.io.*; 4 import java.text.* ...

  4. Vue 动态组件和异步组件

    基础案例 动态组件切换类比"bilibili-个人中心"的横向菜单切换不同的标签页的功能. 在Vue中可以使用 component 标签,并加一个特殊的属性(attribute) ...

  5. Springboot集成RabbitMQ之MessageConvert源码解析

    问题 最近在使用RabbitMq时遇到了一个问题,明明是转换成json发送到mq中的数据,消费者接收到的却是一串数字也就是byte数组,但是使用mq可视化页面查看数据却是正常的,之前在使用过程中从未遇 ...

  6. 码云使用svn无法提交空文件夹

    错误信息: svn: E200015: Commit failed (details follow): svn: E200015: Empty directories is not supported ...

  7. Linux从头学03:如何告诉 CPU,代码段、数据段、栈段在内存中什么位置?

    作 者:道哥,10+年的嵌入式开发老兵. 公众号:[IOT物联网小镇],专注于:C/C++.Linux操作系统.应用程序设计.物联网.单片机和嵌入式开发等领域. 公众号回复[书籍],获取 Linux. ...

  8. sql通用行列转换

    -- 行转列 select 姓名, SUM(case 课程 when '语文' then 分数 else 0 end) as 语文, SUM(case 课程 when '数学' then 分数 els ...

  9. 『心善渊』Selenium3.0基础 — 29、使用HTMLTestRunner生成unittest的HTML报告

    目录 1.HTMLTestRunner介绍 2.HTMLTestRunner的使用 3.测试报告示例 4.封装成模块 1.HTMLTestRunner介绍 HTMLTestRunner是一个基于uni ...

  10. python 10篇 操作mysql

    一.操作数据库 使用pip install pymysql,安装pymysql模块,使用此模块连接MySQL数据库并操作数据库. import pymysql host = 'ip地址' # 链接的主 ...