将几张图片合并为一张图片,返回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 ...
随机推荐
- 《算法详解:C++11语言描述》已出版
经过漫长的编写.修订和印刷过程,书籍<算法详解:C++11语言描述>终于出版了!目前本书已在各大电商平台上架,搜索书名即可找到对应商品.本书的特色在于: 介绍最新的C++11.C++14和 ...
- 35、sudo权限设置
提示:sudo的介绍在"13.linux中用户和用户组"中有详细介绍: (1)简历里要加上如下项目经验: 服务器用户权限管理改造方案与实施项目 日期: 在了解公司业务流程后,提出权 ...
- 32. Longest Valid Parentheses **堆栈
description: Given a string containing just the characters '(' and ')', find the length of the longe ...
- Pytest学习笔记12-配置文件pytest.ini
前言 pytest配置文件可以改变pytest的运行方式,它是一个固定的文件pytest.ini文件,读取配置信息,按指定的方式去运行. 常用的配置项 marks 作用:测试用例中添加了自定义标记( ...
- Python装饰器、迭代器&生成器、re正则表达式、字符串格式化
Python装饰器.迭代器&生成器.re正则表达式.字符串格式化 本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用 ...
- Min25 筛与 Powerful Numbers
Min25 筛与 Powerful Numbers Min25 筛 大喊一声 Min25 NB!!! 这是一个非常神奇的东西,用于求更加普遍的积性函数的前缀和. 比如我们要求 \(\sum_{i=1} ...
- VS2013产品密钥
VS2013 产品密钥 – 所有版本 Visual Studio Ultimate 2013 KEY(密钥):BWG7X-J98B3-W34RT-33B3R-JVYW9 Visual Studio ...
- C语言:size_t类型
size_t 的全称应该是size type,就是说"一种用来记录大小的数据类型".通常我们用sizeof(XXX)操作,这个操作所得到的结果就是size_t类型.因为size_t ...
- 重拾javaweb(假期后第一次web测试)
上学期通过十六周的时间,完成了javaweb的项目实践,其中包括很多次的练习以及测试.寒假时间大多用来挥霍,并没有对这些知识进行复习以及进一步的学习,所以在这场考试中,最终以八分的可怜成绩收尾,实在过 ...
- Java 获取Word批注所标记的文本和图片
[环境配置] 本文将通过Java程序代码来展示如何来获取Word批注所标注的文本和图片.这里使用的Word Jar包工具是Free Spire.Doc for Java,在pom.xml中按如下步骤配 ...