1、想要实现多个图片的纵向和横向拼接。实现代码如下

2、补充发现横向拼接的一个bug 宽度没有增加(已修复)

百度地址:工具jar下载

链接:https://pan.baidu.com/s/1uZCNdwpwXwn9o3wZtSc_5A
提取码:775r
复制这段内容后打开百度网盘手机App,操作更方便哦

实现图片拼接的代码:

import javax.imageio.ImageIO;

import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; /**
* @Author : guoyanan
* @Title : 处理图片的拼接工具类
* @Time : 2019/02/11 10:47
* @Document :
*/
public class ImageHandle { /**
* 图片拼接图片必须长宽一致
* @param files 需要拼接的图片类型
* @param type 1-横向拼接,2-纵向拼接
* @param targetFile 目标文件名称
*/
public static boolean mergeImage(File[] files, int type ,String targetFile){
int len = files.length;
if(len<1){
throw new RuntimeException("图片数量为0,不可以执行拼接");
}
// File[] src = new File[len];
BufferedImage[] images = new BufferedImage[len];
int[][] ImageArrays = new int[len][]; for (int i = 0 ; i < len ; i++){
try {
// src[i] = new File(files[i]);
images[i] = ImageIO.read(files[i]);
}catch (Exception e){
e.printStackTrace();
} int width = images[i].getWidth();
int height = images[i].getHeight();
ImageArrays[i] = new int[width * height];
ImageArrays[i] = images[i].getRGB(0,0,width,height,ImageArrays[i],0,width);
} int newHeight = 0;
int newWidth = 0;
for(int i = 0; i < images.length;i++){
// 横向
if(type == 1){
newHeight = newHeight > images[i].getHeight() ? newWidth : images[i].getHeight();
          // 错误代码,原先没有添加+ 号
newWidth += images[i].getWidth();
}else if (type == 2){
// 纵向
newWidth = newHeight > images[i].getWidth() ? newWidth : images[i].getWidth();
newHeight += images[i].getHeight();
}
} if(type == 1 && newWidth < 1){
return false ;
} if(type == 2 && newHeight < 1){
return false;
} try {
BufferedImage ImageNew = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
int height_i = 0;
int width_i = 0;
for (int i = 0; i < images.length; i++){
if(type == 1){
ImageNew.setRGB(width_i, 0, images[i].getWidth(), newHeight, ImageArrays[i], 0, images[i].getWidth());
width_i += images[i].getWidth();
}else if (type == 2){
ImageNew.setRGB(0, height_i, newWidth, images[i].getHeight(), ImageArrays[i], 0, newWidth);
height_i += images[i].getHeight();
}
}
// 输出想要的图片
ImageIO.write(ImageNew,targetFile.split("\\.")[1], new File(targetFile));
return true;
}catch (Exception e){
e.printStackTrace();
return false;
}
} public static void main(String[] args){
//String[] files = {"F:\\tmp\\OK.jpg","F:\\tmp\\OK.jpg","F:\\tmp\\OK.jpg","F:\\tmp\\OK.jpg","F:\\tmp\\OK.jpg"};
//mergeImage(files,2,"F:\\OK.jpg"); List<Map<String,String>> lists = new ArrayList<Map<String,String>>(); Map<String,String> map1 = new HashMap<>();
map1.put("id","1");
map1.put("cpid","0");
map1.put("text","One Level"); Map<String,String> map2 = new HashMap<>();
map2.put("id","2");
map2.put("cpid","1");
map2.put("text","Two Level"); Map<String,String> map3 = new HashMap<>();
map3.put("id","3");
map3.put("cpid","2");
map3.put("text","Three Level"); lists.add(map1);
lists.add(map2);
lists.add(map3);
List<Map<String,String>> listUp = new ArrayList<Map<String,String>>();
List<Map<String,String>> listTemp = new ArrayList<Map<String,String>>();
for (int i= 0; i < lists.size();i++){
Map<String,String> map = lists.get(i);
if(map.get("cpid")=="0"){
listUp.add(map);
lists.remove(i);
System.out.println(map.get("text"));
}
} ItentorMap(listUp,lists,listTemp); } private static void ItentorMap(List<Map<String,String>> listUp,List<Map<String,String>> listDown,List<Map<String,String>> listTemp){
System.out.println("listUp:"+System.identityHashCode(listUp));
System.out.println("listTemp:"+System.identityHashCode(listTemp));
listTemp.clear();
for (int i=0; i<listUp.size(); i++){
Map<String,String> map = listUp.get(i);
for(int j = 0; j < listDown.size(); j++){
Map<String,String> mapj = listDown.get(j);
if(map.get("id")==mapj.get("cpid")){
listTemp.add(mapj);
listDown.remove(j);
System.out.println(mapj.get("text"));
}
} }
listUp.clear();
// 必须这样写,如果写成listUp=listTemp,会导致2个list集合的内存地址一样。
for (int i = 0;i<listTemp.size(); i++){
listUp.add(listTemp.get(i));
}
System.out.println("listUp:"+System.identityHashCode(listUp));
System.out.println("listTemp:"+System.identityHashCode(listTemp)); if(listDown.size()>0) {
ItentorMap(listUp, listDown, listTemp);
}
} }

java 实现图片拼接的更多相关文章

  1. 将几张图片合并为一张图片,返回byte数组

    需求:通过url数组下载图片,再竖直合成一张新的图片,具体java代码如下 1 /** 2 * 竖直合并图片 3 * 4 * @param urls 5 * @return 6 */ 7 public ...

  2. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  3. Java——Image 图片合并

    1.合并图片 package com.tb.image; import java.awt.Image; import java.awt.image.BufferedImage; import java ...

  4. selenium+java破解极验滑动验证码

    摘要 分析验证码素材图片混淆原理,并采用selenium模拟人拖动滑块过程,进而破解验证码. 人工验证的过程 打开威锋网注册页面(https://passport.feng.com/?r=user/r ...

  5. selenium+java破解极验滑动验证码的示例代码

    转自: https://www.jianshu.com/p/1466f1ba3275 selenium+java破解极验滑动验证码 卧颜沉默 关注 2017.08.15 20:07* 字数 3085  ...

  6. 使用Java合并图片、修改DPI

    项目中有时候需要对图片进行DPI.合并.拼接等的处理: package com.snow.web.a_test; import java.awt.Graphics; import java.awt.i ...

  7. selenium+java破解滑动验证码

    2019-04-16更新 修复极验页面改版,这次采用极验官方的demo地址:https://www.geetest.com/demo/slide-bind.html 截止2019-04-16,极验和腾 ...

  8. 20162324 2016-2017-2《Java程序设计》课程总结

    20162324 2016-2017-2<Java程序设计>课程总结 一.每周作业链接汇总 预备作业01 有关老师与学生关系的几个问题: 预备作业02 做中学: 预备作业03 实验楼学习: ...

  9. base64转图片、图片转base64、图片拼接、加水印(水印角度可设置)

    /** * @Description: 将base64编码字符串转换为图片 * @param imgStr * base64编码字符串 * @param path * 图片路径-具体到文件 * @re ...

随机推荐

  1. 自动适应label

    CGFloat btnH = 300; NSString *text=@"你在这是NSString的对象方法,一个字符串实例调用该方法时,方法会通过传入的参数返回一个CGRect型数据,这个 ...

  2. wget -d --header

    wget -d --header="Host:www.sina.com" http://202.108.33.84 domain differ ip 防止Wget递归下载 假设Ng ...

  3. elastic search远程测试

    elastic search远程测试 推荐:elastic官方教程:https://www.elastic.co/guide/en/elasticsearch/reference/6.2/index. ...

  4. 9.Query on Embedded/Nested Documents-官方文档摘录

    1.插入案例 db.inventory.insertMany( [ { item: "journal", qty: 25, size: { h: 14, w: 21, uom: & ...

  5. node.js---sails项目开发(4)---配置MongoDB数据库连接

    1.安装sails对mongo的依赖 npm install sails-mongo --save 2. 配置mongo连接 修改config/connections.js: module.expor ...

  6. PyNest——part 3: connecting networks with synapses

    part 3: connecting networks with synapses parameterising synapse models NEST提供了各种不同的突触模型. 您可以使用命令nes ...

  7. Angular学习笔记—HttpClient (转载)

    HttpClientModule 应用 导入新的 HTTP Module import {HttpClientModule} from '@angular/common/http'; @NgModul ...

  8. java 多线程 day02 定时器

    package com.czbk.thread; import java.util.Date;import java.util.Timer;import java.util.TimerTask; /* ...

  9. SQL JOIN使用方法

    (转自W3School相关教程:http://www.w3school.com.cn,W3School是不错的在线教程,简洁高效!) 下面列出不同的SQL JOIN类型,以及他们之间的差异: JOIN ...

  10. Web框架简介

    Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...