图片压缩代码和实际操作页面

先编写一个小工具类

复制代码
package com.ai157.aigc.utils;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
public class MyFileUtils {
    public static File convert(MultipartFile multipartFile) throws IOException {
        File file = new File(multipartFile.getOriginalFilename());
        try (InputStream is = multipartFile.getInputStream()) {
            org.apache.commons.io.FileUtils.copyInputStreamToFile(is, file);
        }
        return file;
    }
}

从前端页面上传上来,后端处理类

复制代码
package com.ai157.aigc.controller;
import com.ai157.aigc.utils.MyFileUtils;
import org.apache.commons.io.FileUtils;
import org.csource.common.MyException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Base64;

@RestController
public class FileSmallController {
    @PostMapping("/api/file/small")
    public String handleFileUpload(@RequestParam("file") MultipartFile file,
                                   @RequestParam("scale") Float scale,
                                   @RequestParam("fileType") String fileType
                                   ) {
        try {
            scale = scale/100;//由于我的界面上输入的是百分比数据,所以要除以100
            ByteArrayOutputStream  byteArrayOutputStream = new ByteArrayOutputStream();
            compress(MyFileUtils.convert(file),byteArrayOutputStream,scale);
            return Base64.getEncoder().encodeToString( byteArrayOutputStream.toByteArray());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return "File uploaded successfully!";
    }
   /**
    *这个是处理方法
   */
    public static void compress(File srcFile, ByteArrayOutputStream byteArrayOutputStream, float scale) {
        scale = (float) Math.sqrt(scale);
        try {
            BufferedImage srcImage = ImageIO.read(srcFile);
            int width = (int) (srcImage.getWidth() * scale);
            int height = (int) (srcImage.getHeight() * scale);
            BufferedImage destImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            destImage.getGraphics().drawImage(srcImage.getScaledInstance(width, height, BufferedImage.SCALE_SMOOTH), 0, 0, null);
            ImageIO.write(destImage, "png", byteArrayOutputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

注意下:

1、scale = scale/100;这个为什么除以100,由于前端上传的不是小数,是百分比数值。

2、由于长度和宽度是等比缩小,如果长度是a,宽度是b,那(ax)*(bx)= scale*a*b

所以x平方等于scale。所以在计算前要开方下。

3、由于前端是以图片的方式渲染,所以以Base64的图片数据输出。

实际操作界面请访问以下页面

gpt114,伴你左右!

相关推荐
JH30733 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
Coder_Boy_4 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
invicinble4 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟5 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖5 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
qq_12498707536 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_6 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Mr_sun.6 小时前
Day06——权限认证-项目集成
java
瑶山6 小时前
Spring Cloud微服务搭建四、集成RocketMQ消息队列
java·spring cloud·微服务·rocketmq·dashboard
abluckyboy6 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法