将几张图片合并为一张图片,返回byte数组
需求:通过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数组的更多相关文章
- 用js两张图片合并成一张图片
JS和canvas的合成方式 function drawAndShareImage(){ var canvas = document.createElement("canvas") ...
- HTML5利用canvas,把多张图合并成一张图片
需求分析,根据当前网页中的几张图片,在手机上长按,保存图片到相册或者发送给好友. drawCanvas(){ var self = this; var imgsrcArray = [ require( ...
- java实现把两张图片合并(Graphics2D)
package com.yin.text; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.i ...
- sqlserver 将多行数据查询合并为一条数据
有这样一个需求:表T_FUN_TASK为任务表,有字段(TASKID,TASKNAME),表T_FUN_LOGBOOK为日志表,有字段(LOGID,TASKID,LOGDATE),一个任务可持续多天, ...
- Java中两个或多个byte数组合并及int类型转数组
Java中两个或多个byte数组合并及int类型转数组 // 用list好处是可以未知多个? public static byte[] test(List<byte[]> values) ...
- go语言:多个[]byte数组合并成一个[]byte
场景:在开发中,要将多个[]byte数组合并成一个[]byte,初步实现思路如下: 1.获取多个[]byte长度 2.构造一个二维码数组 3.循环将[]byte拷贝到二维数组中 package gst ...
- java 中byte[] 数组的合并
因工作的需要,在从事 .Net 的开发中接触到了 Java, 虽然在大学的时候学过一段Java 编程,但并没有在实际的工作中使用过, Java 和 .Net的C#语法很相似,都是面向对象的,感觉在语法 ...
- 如何将多条update语句合并为一条
需求: 如何将多条update语句合并为一条update语句:如,update table1 set col='2012' where id='2014001' update table1 ...
- 将文件内容转化为byte数组返回
如何将文件内容转化为byte数组并返回呢?对于这个问题,我献上我第一次成功的代码~ package com.succez.task1; import java.io.ByteArrayOutputSt ...
随机推荐
- 性能工具之Jmeter压测Hprose RPC服务
概述 Hprose(High Performance Remote Object Service Engine),国人开发的一个远程方法调用的开源框架.它是一个先进的轻量级的跨语言跨平台面向对象的高性 ...
- RobotFramework + Python 自动化入门 二 (关键字)
在<RobotFramwork + Python 自动化入门 一>中,完成了Robot环境搭建及测试脚本的创建和执行. 本节,对RobotFramework的关键字使用和查看源码进行介绍. ...
- 为什么 Python 没有函数重载?如何用装饰器实现函数重载?
英文:https://arpitbhayani.me/blogs/function-overloading 作者:arprit 译者:豌豆花下猫("Python猫"公众号作者) 声 ...
- 关于Mysql事务,你必须知道的几个知识点!
Transaction事务 上期我们讲到了jpa的常用操作,查询.更新.删除等,但是如果在操作数据库事务时发生异常,数据会回滚吗?下面我们来看个例子 UserController新增如下代码: @Ge ...
- moment常用方法
1.subtract方法,时间加减处理 console.log(moment().format("YYYY-MM-DD HH:mm:ss")); //当前时间 console.lo ...
- 【Azure 应用服务】Azure Function集成虚拟网络,设置被同在虚拟网络中的Storage Account触发,遇见Function无法触发的问题
一切为了安全,所有的云上资源如支持内网资源访问,则都可以加入虚拟网络 问题描述 使用Azure Function处理Storage Account中Blob 新增,更新,删除等情况.Storage A ...
- 浅析C++的函数式编程
前言 Java8在Java中通过lambda表达式.Stream API引入了函数式编程,那么C++中是否也支持函数式编程呢?答案是肯定的.目前关于C++进行函数式编程的语法探究的相关博客.文章并不多 ...
- 虚拟机安装Windows7旗舰版-超详细图文
虚拟机安装Windows7旗舰版 ----就是想弄一个自己用的CTF+渗透测试的工具集成系统,本来想着用真实机弄就好了,但还是出于安全的考虑,还是再装个虚拟机吧~ 1.先到MSDN找好安装包:http ...
- 关于Word中复杂表格转完美的Markdown格式的技巧
背景 我们都知道有很多工具能做到Word转Markdown格式,但是在某些复杂的需求下,比如带合并单元格的表格,就会出现错乱,效果非常不理想. 那我们今天来学习和探讨下怎么实现完美转换. 转换 如果想 ...
- 如果给IIS添加防火墙入站配置,支持外部或者局域网访问
背景简介 也许你试着在本机IIS运行了一些网站,但是奇怪的是,同网络的终端却无法访问你,这时候极有可能被防火墙拦截了,所以我们要找到正确的姿势来开启魔法了. 找到入站规则设置 不管你是Win7还是Wi ...