java对图片文件进行压缩

public class ImageCompression {

    private static final Logger log = LoggerFactory.getLogger(ImageCompression.class);

    /**
     * 指定图片宽度和高度和压缩比例对图片进行压缩
     *
     * @param imgSrc  源图片地址
     */
    public static MultipartFile reduceImg(MultipartFile imgSrc) {
        //目标文件
        String slvPath = JavaToLinuxUtil.validWinSystem() ? "/DataDisk/temFile/slt" : "E:\\DataDisk\\temFile\\slt";
        File mkdir = new File(slvPath);
        if (!mkdir.exists()){
            mkdir.mkdir();
        }
        File toFile = new File(slvPath + File.separator + imgSrc.getOriginalFilename());
        try (FileOutputStream target = new FileOutputStream(toFile)) {
            File srcFile = MultipartFileTofile.changeForFile(imgSrc, JavaToLinuxUtil.validWinSystem() ? "/DataDisk/temFile/ytp" : "E:\\DataDisk\\temFile\\ytp");
            // 检查图片文件是否存在
            if (!srcFile.exists()) {
                log.error("压缩资源文件不存在");
            }
            int[] results = getImgWidthHeight(srcFile);
            int widthDist = results[0] / 8;
            int heightDist = results[1] / 8;
            // 开始读取文件并进行压缩
            Image src = ImageIO.read(srcFile);
            // 构造一个类型为预定义图像类型之一的 BufferedImage
            BufferedImage source = new BufferedImage(widthDist, heightDist, BufferedImage.TYPE_INT_RGB);
            // 这边是压缩的模式设置
            source.getGraphics().drawImage(src.getScaledInstance(widthDist, heightDist, Image.SCALE_SMOOTH), 0, 0, null);
            //将图片按JPEG压缩,保存到out中
            ImageIO.write(source, "jpg", target);
            MultipartFile multipartFile = MultipartFileTofile.fileToMultipartFile(toFile);
            toFile.delete();
            return multipartFile;
        } catch (Exception ef) {
            ef.printStackTrace();
        }
        return null;
    }

    /**
     * 获取图片宽度和高度
     *
     * @param file 图片路径
     * @return 返回图片的宽度
     */
    public static int[] getImgWidthHeight(File file) {
        int result[] = {0, 0};
        try {
            // 获得文件输入流
            InputStream is  = new FileInputStream(file);
            // 从流里将图片写入缓冲图片区
            BufferedImage src = ImageIO.read(is);
            // 得到源图片宽
            result[0] = src.getWidth(null);
            // 得到源图片高
            result[1] = src.getHeight(null);
            //关闭输入流
            is.close();
        } catch (Exception ef) {
            ef.printStackTrace();
        }
        return result;
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值