java 实现图片拼接
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 实现图片拼接的更多相关文章
- 将几张图片合并为一张图片,返回byte数组
需求:通过url数组下载图片,再竖直合成一张新的图片,具体java代码如下 1 /** 2 * 竖直合并图片 3 * 4 * @param urls 5 * @return 6 */ 7 public ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- Java——Image 图片合并
1.合并图片 package com.tb.image; import java.awt.Image; import java.awt.image.BufferedImage; import java ...
- selenium+java破解极验滑动验证码
摘要 分析验证码素材图片混淆原理,并采用selenium模拟人拖动滑块过程,进而破解验证码. 人工验证的过程 打开威锋网注册页面(https://passport.feng.com/?r=user/r ...
- selenium+java破解极验滑动验证码的示例代码
转自: https://www.jianshu.com/p/1466f1ba3275 selenium+java破解极验滑动验证码 卧颜沉默 关注 2017.08.15 20:07* 字数 3085 ...
- 使用Java合并图片、修改DPI
项目中有时候需要对图片进行DPI.合并.拼接等的处理: package com.snow.web.a_test; import java.awt.Graphics; import java.awt.i ...
- selenium+java破解滑动验证码
2019-04-16更新 修复极验页面改版,这次采用极验官方的demo地址:https://www.geetest.com/demo/slide-bind.html 截止2019-04-16,极验和腾 ...
- 20162324 2016-2017-2《Java程序设计》课程总结
20162324 2016-2017-2<Java程序设计>课程总结 一.每周作业链接汇总 预备作业01 有关老师与学生关系的几个问题: 预备作业02 做中学: 预备作业03 实验楼学习: ...
- base64转图片、图片转base64、图片拼接、加水印(水印角度可设置)
/** * @Description: 将base64编码字符串转换为图片 * @param imgStr * base64编码字符串 * @param path * 图片路径-具体到文件 * @re ...
随机推荐
- [Algorithms] Counting Sort
Counting sort is a linear time sorting algorithm. It is used when all the numbers fall in a fixed ra ...
- 解决----------“win10,不能打字了,已禁用IME”
登录Windows 10系统桌面后,右键点击左下角的开始菜单图标,然后在弹出菜单中选择“计算机管理”菜单项在打开的“计算机管理”窗口中,找到左侧系统工具下的“任务计划程序”菜单项点击任务计划程序前面的 ...
- Unicode 和 UTF-8 是什么关系?
2015-10-14 10:08 评论: 9 收藏: 4 转载自: http://huoding.com/2015/10/13/472作者: 火丁笔记本文地址:https://linux.cn/ ...
- 使用idea的条件断点快速定位注解的处理类
看代码时会碰到注解的处理类难定位的情况,比如spring的某个注解我们想知道到底是谁在处理他,他起什么作用,通过普通的代码搜索功能不容易找到,比如好用的方法就是条件断点. 比如下断:Accessibl ...
- Selenium定位不到指定元素原因之iframe(unable to locate element)
浏览过程中,图片中的内容可能太小,无法看清,可以>右键>在新标签中打开 Outline 项目原因,需要用selenium实现模拟登陆.模拟上传文件,自然就需要模拟点击[上传]按钮: 模拟点 ...
- Django页面重定向
重定向分为永久性重定向和暂时性重定向,在页面上体现的操作就是浏览器会从一个页面自动跳转到另外一个页面.比如用户访问了一个需要权限的页面,但是该用户当前并没有登录,因此我们应该给他重定向到登录页面. 永 ...
- python web框架 Django的APP以及目录介绍 django 1.11版本
如果有很多业务请求函数 应该放在app目录 很多业务放在主站上 当用户一点跳到分站 例如 一个项目叫运维平台 他的业务 有资产管理 私有云 监控 不同业务线 chouti项目 - chouti - ...
- openPOWERLINK代码在vs2008下编译
以openPOWERLINK_V1.08为例: 1.在主目录下新建Build目录 2.使用cmake-gui对代码进行配置 3.配置完成后生成工程文件xxx.sln 4.使用vs2008打开上述文件, ...
- .net截取字符串
string s=abcdeabcdeabcdestring[] sArray1=s.Split(new char[3]{c,d,e}) ;foreach(string i in sArray1)Co ...
- Java泛型四:Java泛型总结
原文地址https://www.cnblogs.com/lwbqqyumidi/p/3837629.html 一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: 1 publ ...