zoukankan      html  css  js  c++  java
  • 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); } } }
  • 相关阅读:
    Centos 7 LVM xfs文件系统修复
    Feign报错'xx.FeignClientSpecification', defined in null, could not be registered.
    IDEA提示不区分大小写设置
    基于SpringBoot的多模块项目引入其他模块时@Autowired无法注入其他模块stereotype注解类对象的问题解决
    docker安装mysql
    [转]【收藏】用消息队列和消息应用状态表来消除分布式事务
    临时修改当前crontab编辑器
    golang处理 json中非法字符
    nsq里面WaitGroups两种实用的用法
    golang zlib 压缩,解压缩
  • 原文地址:https://www.cnblogs.com/gynbk/p/10750661.html
Copyright © 2011-2022 走看看