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


批量图片裁剪

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?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;
    }
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM