将几张图片合并为一张图片,返回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 ...
随机推荐
- 4、oracle表操作
4.1.dml操作: 1.查看当前用户下所有的表: select * from user_tables; 2.查看某表的大小: select sum(bytes)/(1024*1024) as &qu ...
- 如何使用「mkvtoolnix」和「GoldWave」仅保留视频中左、右声道的其中一个声道?
为什么要这样做? 我手上有一部电视剧的视频文件(.rmvb),每个视频文件都是"国/粤双语"的,与其他双语视频的两种语言的音频保存在两个音轨上不同,我这里的视频文件的双语是分别保存 ...
- C# 启动项目直接修改电脑的日期格式
启动界面添加 1.引用添加 using System.Runtime.InteropServices; 2.方法添加 [DllImport("kernel32.dll", Entr ...
- ActiveMq 之JMS 看这一篇就够了
什么是JMS MQ 全称:Java MessageService 中文:Java 消息服务. JMS 是 Java 的一套 API 标准,最初的目的是为了使应用程序能够访问现有的 MOM 系 统(MO ...
- 【Java集合】ArrayList源码分析
ArrayList是日常开发中经常使用到的集合,其底层采用数组实现,因此元素按序存放.其优点是可以使用下标来访问元素,时间复杂度是O(1).其缺点是删除和增加操作需要使用System.arraycop ...
- 免费版:Xshell和Xftp下载路径
家庭版Xshell和Xftp下载地址: 下载地址:https://www.netsarang.com/zh/free-for-home-school/
- <jsp:param>传递参数,出现乱码问题
今天在学习<jsp:forward>和<jsp:param>时,用<jsp:param>传递参数时,出现乱码问题,部分代码如下: 1 <jsp:forward ...
- 输出 time 命令的结果到文件中
译至:http://unicus.jp/skmk/archives/338 由于输出 time 命令的结果到文件时使用的错误的方式,所以将其记录下来. 环境是bash. 目标 将运行的a.out程序的 ...
- 解决 .net core 中 nuget 包版本冲突问题[转载]
今天在一个 asp.net core 项目中遇到了 nuget 包版本冲突的问题,错误信息如下: Version conflict detected for Microsoft.AspNet.WebA ...
- Hive——简介
Hive--简介 Hive 是基于 Hadoop 构建的一套数据仓库分析系统,它提供了丰富的 SQL 查询方式来分析存储在 Hadoop 分布式文件系统中的数据, 可以将结构化的数据文件映射为一张数据 ...