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. 动态获取selected的value值

    两个select选项,第一个选项可以选1-9之间的数字,第二个选项可以选0到9之间的数字,要满足成人和儿童的总和不大于9,且一个成人最多带两名儿童 <div> <span>成人 ...

  2. Contos更换python版本

    1.查看版本 #python -VPython 2.6.6 2.安装前准备,安装相关库#yum install gcc gcc-c++ autoconf automake#yum install op ...

  3. Android 使用 WebView

    package gzdewei.com.android; import android.app.Activity; import android.os.Bundle; import android.v ...

  4. Xcode 编译静态库

    有时候,我们需要将一部分经常用到的代码提取出来用来复用,或者说需要用到c++的代码的时候,可以通过编译成静态库的方式来使用.本文中使用的Xcode版本是8.3,静态库制作过程和其他版本基本一样,可能出 ...

  5. Java方法区和永久代

    Java方法区和永久代 目前有三大Java虚拟机:HotSpot,oracle JRockit,IBM J9. JRockit是oracle发明的,用于其WebLogic服务器,IBM JVM是IBM ...

  6. 兼容获取元素当前样式 currentStyle || getComputedStyle

    function getStyle(ele, attr) { return ele.currentStyle ? ele.currentStyle[attr] : window.getComputed ...

  7. 利用Docker快速部署Oracle环境

    工作中需要频繁使用Oracle环境,但是每次搭建起来比较消耗时间,本想通过虚拟机模板的方式来快速安装oracle vm,但是每次改ip等环境也很耗时,因此想到docker中有没有已经做好的images ...

  8. JS操作时间 - UNIX时间戳简单介绍

    准备知识 GMT(Greenwich Mean Time) - 格林尼治时间.UTC(Universal Time Code) - 国际协调时间.PST(Pacific Standard Time,太 ...

  9. 关于shared pool的深入探讨(五)

    Oracle使用两种数据结构来进行shared pool的并发控制:lock 和 pin.Lock比pin具有更高的级别. Lock在handle上获得,在pin一个对象之前,必须首先获得该handl ...

  10. php RFC兼容的电子邮件地址验证

    php中,进行RFC兼容的电子邮件地址验证的方法,有需要的朋友参考下吧. 分享一个可以验证RFC兼容的电子邮件地址的代码,支持RFC1123,2396,3696,4291,4343,5321等的验证. ...