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 ...
随机推荐
- Html5-draggable元素拖动
Html5元素拖动 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. Internet Explorer 9+, Firefox, Opera, Chrome, 和 Safari 支持拖动 ...
- 创建自己的java类库并加以调用方法
第一次搞博客,心里有点发慌,记录一下:2018/2/1/ 21:33 今天Think In Java第4版 中文版(英文看着可能很耗时),看到了6.1.3 定制工具库这一章节,之前作者调用自己的类 ...
- python基础之类的编码风格
自定义工作流程: 一开始应让代码结构尽可能简单.先尽可能在一个文件中完成所有的工作,确定一切都能正确运行后,再将类移动独立的模块中.如果你喜欢模块和文件的交互方式,可在项目开始时就尝试将类存储到模块中 ...
- Redis的Python客户端redis-py说明文档(转)
add by zhj: 对Publish / Subscribe,LUA Scripting,Sentinel support,Scan Iterators等部分没有翻译,需要的用户参见英文原文吧.另 ...
- 分布式计算hadoop三大组件
设计原则:移动计算,而不是移动数据 计算层:Map/Reduce调度层:YARN数据层:HDFS 这三层之间没有必然的依赖性,只是经常这么搭配,而且都是hadoop那个包里一起安装的,三层都可以独立运 ...
- linux系统下nginx安装目录和nginx.conf配置文件目录
linux系统下nginx安装目录和nginx.conf配置文件目录 1.查看nginx安装目录 输入命令 # ps -ef | grep nginx 返回结果包含安装目录 root 26 ...
- Java io流详解三
public class IOpractise { public void iotest() { int b= 0; FileInputStream fis = null; try { fis = n ...
- mysql 练习题(Day44)
init.sql文件内容 /* 数据导入: Navicat Premium Data Transfer Source Server : localhost Source Server Type : M ...
- 微信小程序学习笔记(4)--------框架之逻辑层
逻辑层 逻辑层(App Service):小程序框架的逻辑层是由JavaScript编写的,逻辑层将数据进行处理后发送给视图层,同时接受视图层的事件反馈. App进行程序注册,Page进行页面注册 g ...
- C++模板专门化与重载
最近在复习C++有关知识,又重新看<<Effective C++>>,收获颇丰.原来以前看这边书,好多地方都是浅尝辄止.<<Effective C++>> ...