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. cocos2d-X学习之主要类介绍:摄像机(CCCamera)

    在cocos2d-x中,每个节点(CCNode)都需要用到,即当节点发生旋转.缩放和位置变化等时,都需要覆盖CCCamera,然后这个节点通过CCCamera重新渲染. 类结构: 其主要函数如下: c ...

  2. Go语言性能测试

    对于一些服务来说,性能是极其重要的一环,事关系统的吞吐.访问的延迟,进而影响用户的体验. 写性能测试在Go语言中是很便捷的,go自带的标准工具链就有完善的支持,下面我们来从Go的内部和系统调用方面来详 ...

  3. 巨蟒python全栈开发数据库前端7:jQuery框架

    每个人的标准不同,看法等等,认识,价值观有所不同,促成了这些矛盾. 1.select例子 <!DOCTYPE html> <html lang="en"> ...

  4. 《挑战程序设计竞赛》2.4 数据结构-并查集 POJ1182 2236 1703 AOJ2170

    POJ1182 http://poj.org/problem?id=1182 题目 难得的中文题... 食物链 Time Limit: 1000MS Memory Limit: 10000K Tota ...

  5. DjangoDRF序列化组件使用

    创建一个Django项目,名字:untitled1 创建三张表 from django.db import models class Publish(models.Model): nid = mode ...

  6. Android View学习Tips

    1.Canvas.save()和Canvas.restore() canvas.save();和canvas.restore();是两个相互匹配出现的,作用是用来保存画布的状态和取出保存的状态的.这里 ...

  7. gdb各种调试命令和技巧

    陈皓:用GDB调试程序 GDB概述———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台 ...

  8. DOM实例

    同一种功能两种方法: <script type='text/javascript'> <!-- var tag = document.creatElement("a&quo ...

  9. 在w3cschool学完html,css,javascript,jquery以后,还是不会做前端怎么办?

    w3cschool是一个非盈利性的在线技术学习网站,提供按W3C标准编写的基础教程.完整的看完w3cschool上面的手册,可以基本掌握编程语法.基础性的东西通常都会比较零散,因此,在学习一段时间后, ...

  10. form:checkboxes radiobutton select用法

    <form:checkboxes path="subjects" items="${requestScope.subjects}" element=&qu ...