• 批量图片裁剪(对多个文件夹内图片根据标注文件进行裁剪)


    批量图片裁剪

    pom.xml

    	<dependency>
          <groupId>com.google.guava</groupId>
          <artifactId>guava</artifactId>
          <version>17.0</version>
        </dependency>
        <dependency>
          <groupId>org.apache.tomcat</groupId>
          <artifactId>tomcat-coyote</artifactId>
          <version>9.0.45</version>
        </dependency>
        <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-lang3</artifactId>
          <version>3.7</version>
        </dependency>
    
    import com.google.common.io.Files;
    import org.apache.commons.lang3.StringUtils;
    
    import javax.imageio.ImageIO;
    import java.awt.image.BufferedImage;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.*;
    
    import static org.example.HttpUtil.downloadImage;
    
    public class 图片裁剪 {
        public static void main(String[] args) throws IOException {
            List<String> folderList = new ArrayList<>();
            folderList.add("D:\image\images\草履蚧\草履蚧");
            folderList.add("D:\image\images\褐边绿刺蛾\褐边绿刺蛾");
    
            for (String folder : folderList) {
                getFiles(folder, "");
            }
        }
    
        public static void getFiles(String path, String url) throws IOException {
            /*** *******************************************************************************************/
            File file = new File(path);
            File[] tempList = file.listFiles();
            List<标注实体> listBean = new ArrayList<>();
            for (int i = 0; i < tempList.length; i++) {
                if (tempList[i].isFile()) {
                    File fileXml = tempList[i];
    
                    标注实体 Bean = new 标注实体();
                    Bean.setName(fileXml.getName());
                    try (BufferedReader bufferedReader = new BufferedReader(new FileReader(fileXml))) {
                        String str = null;
                        int flag = 0;
                        List<Map<String, Integer>> list = new ArrayList<>();
                        while ((str = bufferedReader.readLine()) != null) {
                            if (str.contains("xmin")) {
                                Map<String, Integer> map = new HashMap();
                                int indexOf = str.indexOf(">");
                                int indexOf2 = str.indexOf("</");
                                String substring = str.substring(indexOf + 1, indexOf2);
                                map.put("xmin", Integer.valueOf(substring));
                                list.add(map);
                            }
                            if (str.contains("ymin")) {
                                Map<String, Integer> map = list.get(flag);
                                int indexOf = str.indexOf(">");
                                int indexOf2 = str.indexOf("</");
                                String substring = str.substring(indexOf + 1, indexOf2);
                                map.put("ymin", Integer.valueOf(substring));
                                list.set(flag, map);
                            }
                            if (str.contains("xmax")) {
                                Map<String, Integer> map = list.get(flag);
                                int indexOf = str.indexOf(">");
                                int indexOf2 = str.indexOf("</");
                                String substring = str.substring(indexOf + 1, indexOf2);
                                map.put("xmax", Integer.valueOf(substring));
                                list.set(flag, map);
                            }
                            if (str.contains("ymax")) {
                                Map<String, Integer> map = list.get(flag);
                                int indexOf = str.indexOf(">");
                                int indexOf2 = str.indexOf("</");
                                String substring = str.substring(indexOf + 1, indexOf2);
                                map.put("ymax", Integer.valueOf(substring));
                                list.set(flag, map);
                                Bean.setContentSize(list);
                                flag++;
                            }
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    listBean.add(Bean);
                }
            }
            /*** *******************************************************************************************/
            int lastIndexOf = path.lastIndexOf("\");
            String lastPath = path.substring(0, lastIndexOf);
            File lastFile = new File(lastPath);
            File[] lastFileList = lastFile.listFiles();
            for (int i = 0; i < lastFileList.length; i++) {
                if (lastFileList[i].isFile()) {
                    File imgFile = lastFileList[i];
                    String name = imgFile.getName().substring(0, imgFile.getName().lastIndexOf("."));
                    for (标注实体 bean : listBean) {
                        String fineName = bean.getName().substring(0, bean.getName().lastIndexOf("."));
                        if (name.equals(fineName)) {
                            BufferedImage bufImage = ImageIO.read(imgFile);
                            List<Map<String, Integer>> contentSize = bean.getContentSize();
                            if (contentSize != null && contentSize.size() != 0){
                                for (int i1 = 0; i1 < contentSize.size(); i1++) {
                                    Map<String, Integer> map = contentSize.get(i1);
                                    try {
    
    
                                        File folder = new File(lastPath + File.separator + "cut" + File.separator );
                                        if (!folder.exists()){
                                            folder.mkdirs();
                                        }
    
                                        // 获取图片的宽高
                                        final int width = bufImage.getWidth();
                                        final int height = bufImage.getHeight();
                                        Integer xmin = map.get("xmin")<0?0:map.get("xmin");
                                        Integer ymin = map.get("ymin")<0?0:map.get("ymin");
                                        Integer xmax = map.get("xmax")>width?map.get("xmax");
                                        Integer ymax = map.get("ymax")>height?height:map.get("ymax");
                                        Integer x = xmax - xmin;
                                        Integer y = ymax - ymin;
    
                                       /**
                                         * 裁剪图片, 参数说明:
                                         *     x: 裁剪起点横坐标
                                         *     y: 裁剪起点纵坐标
                                         *     w: 需要裁剪的宽度
                                         *     h: 需要裁剪的高度
                                         */
                                     // bufImage.getSubimage (int x, int y, int w, int h);
                                        BufferedImage subimage = bufImage.getSubimage(xmin, ymin, x, y);
    
                                        String picName = bean.getName().substring(bean.getName().lastIndexOf("/") + 1);
                                        byte[] imageData = downloadImage(imgFile);
                                        String picFormat = getFormatName(picName, imageData);
    //                                    System.out.println("fileName: " + picName + ", fileFormat: " + picFormat);
    
                                        ImageIO.write(subimage, picFormat, new File(lastPath+File.separator+"cut"+File.separator+name+"_"+i1+".jpg"));
                                    }catch (Exception e){
                                        System.out.println(bean.getName());
                                    }
    
                                }
                                break;
                            }
    
                        }
                    }
                }
            }
        }
    
        /**
         * 根据图片名来获取图片格式
         * @param imageName 图片名
         * @return 图片格式
         */
        private static String getFormatName(String imageName) {
            String extension = Files.getFileExtension(imageName);
            if (StringUtils.isBlank(extension)) {
                return FileFormatEnum.JPG.getValue();
            }
    
            for (FileFormatEnum fileFormatEnum : FileFormatEnum.values()) {
                if (StringUtils.equalsIgnoreCase(fileFormatEnum.getValue(), extension)) {
                    return fileFormatEnum.getValue();
                }
            }
            return FileFormatEnum.UNKNOWN.getValue();
        }
    
        /**
         * 获取图片格式
         * @param imageName 图片名
         * @param imageBytes 图片字节码
         * @return 图片格式
         */
        private static String getFormatName(String imageName, byte[] imageBytes) {
            // 根据图片字节码读取图片类型
            FileFormatEnum formatName = getImageFormat(imageBytes);
            if (formatName != FileFormatEnum.UNKNOWN) {
                return formatName.getValue();
            }
    
            // 如果通过字节码没有取到图片类型,则根据文件名来判断
            return getFormatName(imageName);
        }
    
        /**
         * 读取图片格式
         * @param imageBytes 图片字节码数组
         * @return 图片格式
         */
        private static FileFormatEnum getImageFormat(byte[] imageBytes) {
            // 读取文件的前几个字节来判断图片格式
            byte[] b = Arrays.copyOf(imageBytes, 4);
            String type = bytesToHexString(b).toUpperCase();
            for (FileFormatEnum FileFormatEnum : FileFormatEnum.values()) {
                if (type.contains(FileFormatEnum.getCode())) {
                    return FileFormatEnum;
                }
            }
            return FileFormatEnum.UNKNOWN;
        }
    
    
        /**
         * 将要读取文件头信息的文件的byte数组转换成string类型表示
         * @param src 要读取文件头信息的文件的byte数组
         * @return 图片类型字符串
         */
        private static String bytesToHexString(byte[] src){
            StringBuilder stringBuilder = new StringBuilder();
            if (src == null || src.length <= 0) {
                return null;
            }
            for (int i = 0; i < src.length; i++) {
                // 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式
                int v = src[i] & 0xFF;
                String hv = Integer.toHexString(v);
                if (hv.length() < 2) {
                    stringBuilder.append(0);
                }
                stringBuilder.append(hv);
            }
            return stringBuilder.toString();
        }
    }
    

    HttpUtil

    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import org.apache.tomcat.util.http.fileupload.IOUtils;
    
    public class HttpUtil {
        public static byte[] downloadImage(File file) {
            byte[] dataBuffer = null;
    
            try {
                    InputStream input = new FileInputStream(file);
                    ByteArrayOutputStream output = new ByteArrayOutputStream();
                    IOUtils.copy(input, output);
                    output.flush();
                    input.close();
                    dataBuffer = output.toByteArray();
                    output.close();
            } catch (Exception var17) {
            } finally {
    
            }
    
            return dataBuffer;
        }
    }
    

    标注实体

    import java.util.List;
    import java.util.Map;
    
    public class 标注实体 {
        private String name;
        private List<Map<String,Integer>> contentSize;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public List<Map<String, Integer>> getContentSize() {
            return contentSize;
        }
    
        public void setContentSize(List<Map<String, Integer>> contentSize) {
            this.contentSize = contentSize;
        }
    }
    

    FileFormatEnum

    public enum FileFormatEnum {
        /**
         *  文件格式枚举
         */
        JPG("FFD8FF", "jpg"),
    //    JPEG("FFD8FFE0", "jpeg"),
        PNG("89504E47", "png"),
        GIF("47494638", "gif"),
        BMP("424D", "bmp"),
        
        TIF("49492A00", "tif"),
        DWG("41433130", "dwg"),
        PSD("38425053", "psd"),
        RTF("7B5C727466", "rtf"),
        XML("3C3F786D6C", "xml"),
        HTML("68746D6C3E", "html"),
        EML("44656C69766572792D646174653A", "eml"),
        /**
         *  word or xls
         */
        DOC("D0CF11E0", "doc"),
        MDB("5374616E64617264204A", "mdb"),
        PS("252150532D41646F6265", "ps"),
        PDF("255044462D312E", "pdf"),
        /**
         * word  or  xlsx
         */
        DOCX("504B0304", "docx"),
        RAR("52617221", "rar"),
        WAV("57415645", "wav"),
        AVI("41564920", "avi"),
        RM("2E524D46", "rm"),
        MPG("000001B", "mpg"),
        MOV("6D6F6F76", "mov"),
        ASF("3026B2758E66CF11", "asf"),
        MID("4D546864", "mid"),
        GZ("1F8B08", "gz"),
        EXE_DLL("4D5A9000", "exe/dll"),
        TXT("75736167", "txt"),
    
        UNKNOWN("000000", "unknown")
     ;
    
        private String code;
        private String value;
    
        FileFormatEnum(String code ,String value){
            this.code = code;
            this.value = value;
        }
    
        public String getValue() {
            return this.value;
        }
    
        public String getCode() {
            return this.code;
        }
    }
    
  • 相关阅读:
    HDU 2563 统计问题 (DFS + 打表)
    KendoUi中KendoDropDownList控件的使用——三级级联模块的实现
    POJ 1325 &amp;&amp; ZOJ 1364--Machine Schedule【二分图 &amp;&amp; 最小点覆盖数】
    crontab FAQ
    思科2960trunk vlan配置及路由IP配置
    hdoj-1593-find a way to escape【数学题】
    Java编程思想(四) —— 复用类
    在 Android 应用程序中使用 SQLite 数据库以及怎么用
    Swift Standard Library Reference.pdf
    VC、IE、ASP环境下打印、预备的完美解决方式
  • 原文地址:https://www.cnblogs.com/ideaAI/p/14777277.html
Copyright © 2020-2023  润新知