package com.doumee.core.utils; 
 | 
  
 | 
import com.alibaba.fastjson.JSONObject; 
 | 
import com.doumee.biz.system.SystemDictDataBiz; 
 | 
import com.doumee.core.utils.aliyun.ALiYunUtil; 
 | 
import io.swagger.annotations.ApiImplicitParam; 
 | 
import io.swagger.annotations.ApiImplicitParams; 
 | 
import io.swagger.annotations.ApiOperation; 
 | 
import org.apache.commons.lang3.StringUtils; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.web.bind.annotation.PostMapping; 
 | 
import org.springframework.web.bind.annotation.RequestMapping; 
 | 
import org.springframework.web.bind.annotation.RequestMethod; 
 | 
import org.springframework.web.bind.annotation.ResponseBody; 
 | 
import org.springframework.web.multipart.MultipartFile; 
 | 
import org.springframework.web.multipart.MultipartHttpServletRequest; 
 | 
import org.springframework.web.multipart.commons.CommonsMultipartResolver; 
 | 
  
 | 
import javax.imageio.IIOImage; 
 | 
import javax.imageio.ImageIO; 
 | 
import javax.imageio.ImageWriteParam; 
 | 
import javax.imageio.ImageWriter; 
 | 
import javax.imageio.stream.ImageOutputStream; 
 | 
import javax.servlet.http.HttpServletRequest; 
 | 
import javax.servlet.http.HttpServletResponse; 
 | 
import java.awt.*; 
 | 
import java.awt.image.BufferedImage; 
 | 
import java.io.*; 
 | 
import java.nio.file.Files; 
 | 
import java.nio.file.Path; 
 | 
import java.nio.file.Paths; 
 | 
import java.nio.file.StandardCopyOption; 
 | 
import java.util.HashMap; 
 | 
import java.util.Iterator; 
 | 
import java.util.Map; 
 | 
import java.util.UUID; 
 | 
  
 | 
  
 | 
public class FaceImageCompress { 
 | 
  
 | 
  
 | 
    @Autowired 
 | 
    private SystemDictDataBiz systemDictDataBiz; 
 | 
  
 | 
    public static void main(String[] args) { 
 | 
        compressAllFiles(new File("/usr/local/ftp/member/20240317"),800); 
 | 
//        compressAllFiles(new File("D://visit")); 
 | 
    } 
 | 
    public static void compressAllFiles(File folder ,int w) { 
 | 
        File[] files = folder.listFiles(); 
 | 
        for (File file : files) { 
 | 
            if (file.isDirectory()) { 
 | 
//                getAllFiles(file); 
 | 
            } else { 
 | 
                compressImg(file,w); 
 | 
                System.out.println(file.getAbsolutePath()); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public static void compressImageNew(File input, long targetSize) { 
 | 
        try { 
 | 
            BufferedImage image = ImageIO.read(input); 
 | 
  
 | 
            // 使用IIOImage封装BufferedImage 
 | 
            IIOImage iioImage = new IIOImage(image, null, null); 
 | 
  
 | 
            // 获取所有可用的ImageWriter 
 | 
            Iterator<ImageWriter> imageWriters = ImageIO.getImageWritersByFormatName("jpeg"); 
 | 
            if (!imageWriters.hasNext()) { 
 | 
                throw new IOException("No JPEG image writers found"); 
 | 
            } 
 | 
            String name = input.getAbsolutePath(); 
 | 
            copyToNewfile(input); 
 | 
            input.delete(); 
 | 
            ImageWriter imageWriter = imageWriters.next(); 
 | 
            File output = new File(name); 
 | 
            // 设置压缩参数 
 | 
  
 | 
            ImageWriteParam imageWriteParam = imageWriter.getDefaultWriteParam(); 
 | 
            imageWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
 | 
            imageWriteParam.setCompressionQuality(1f); // 初始质量为最高 
 | 
  
 | 
            // 写入文件前计算目标文件大小 
 | 
            long fileSize = 0; 
 | 
            do { 
 | 
                // 清空写入器以便重用 
 | 
                imageWriter.reset(); 
 | 
  
 | 
                // 设置新的压缩质量 
 | 
                float quality = imageWriteParam.getCompressionQuality(); 
 | 
                imageWriteParam.setCompressionQuality(quality - (quality * 2) / 100); // 降低质量 
 | 
  
 | 
                // 写入文件 
 | 
                imageWriter.setOutput(ImageIO.createImageOutputStream(output)); 
 | 
                imageWriter.write(null, iioImage, imageWriteParam); 
 | 
  
 | 
                // 更新文件大小 
 | 
                fileSize = output.length(); 
 | 
  
 | 
                // 检查文件大小是否满足要求 
 | 
            } while (fileSize > targetSize && imageWriteParam.getCompressionQuality() > 0); 
 | 
  
 | 
            imageWriter.dispose(); 
 | 
  
 | 
        } catch (IOException e) { 
 | 
            e.printStackTrace(); 
 | 
        } 
 | 
    } 
 | 
    public static  void compressImg(File file, int w) { 
 | 
        try { 
 | 
            if(w <500){ 
 | 
                return; 
 | 
            } 
 | 
  
 | 
            long originalFileSize = file.length(); 
 | 
            BufferedImage originalImage = ImageIO.read(file); 
 | 
            double compressionRatio =  (double) originalFileSize / (200 * 1024.0); 
 | 
            if (compressionRatio > 1 && originalImage.getWidth()>w) { 
 | 
                System.out.println("==========================="+compressionRatio); 
 | 
//                int compressedWidth = (int) (originalImage.getWidth() / compressionRatio); 
 | 
//                int compressedHeight = (int) (originalImage.getHeight() / compressionRatio); 
 | 
                int compressedWidth = w; 
 | 
                double tt =(double)w / (double)originalImage.getWidth(); 
 | 
                int compressedHeight = (int) (originalImage.getHeight() * tt); 
 | 
                BufferedImage compressedImage = new BufferedImage(compressedWidth, compressedHeight, BufferedImage.TYPE_INT_RGB); 
 | 
                Graphics2D graphics = compressedImage.createGraphics(); 
 | 
                graphics.drawImage(originalImage, 0, 0, compressedWidth, compressedHeight, null); 
 | 
//                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
 | 
//                ImageOutputStream imOut = ImageIO.createImageOutputStream(byteArrayOutputStream); 
 | 
//                ImageIO.write(compressedImage, "jpg", imOut); 
 | 
//                InputStream inputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); 
 | 
                graphics.dispose(); 
 | 
                String oldFile=    copyToNewfile(file); 
 | 
                String name = file.getAbsolutePath(); 
 | 
                file.delete(); 
 | 
                File outputfile= new File(name); 
 | 
                ImageIO.write(compressedImage, "jpg", outputfile); 
 | 
                if(outputfile.length()<50 * 1024.0){ 
 | 
                    resetOldfile(oldFile); 
 | 
                } 
 | 
            } else { 
 | 
                //不处理 
 | 
            } 
 | 
        } catch (Exception e) { 
 | 
            e.printStackTrace(); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public static String copyToNewfile(File file ){ 
 | 
        try { 
 | 
            String oldFile = file.getAbsolutePath(); 
 | 
            String newFile = oldFile.replace(file.getName(),"copy/"+file.getName()); 
 | 
            Path sourcePath = Paths.get(oldFile); 
 | 
            Path destinationPath = Paths.get( newFile); 
 | 
            Files.copy(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING); 
 | 
            return  newFile; 
 | 
        } catch (Exception e) { 
 | 
            e.printStackTrace(); 
 | 
        } 
 | 
        return null; 
 | 
    } 
 | 
    public static void resetOldfile(String oldFile ){ 
 | 
        try { 
 | 
            String newFile= oldFile.replace( "copy/",""); 
 | 
            Path sourcePath  = Paths.get(oldFile); 
 | 
            Path destinationPath = Paths.get( newFile); 
 | 
            Files.copy(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING); 
 | 
        } catch (Exception e) { 
 | 
            e.printStackTrace(); 
 | 
        } 
 | 
    } 
 | 
} 
 |