当前位置:首页 >> 农业机械

拒绝卡脖子 | 借助于自己的图片压缩工具,想怎么压就怎么压

来源:农业机械 时间:2023-06-03

Thumbnails.of(file.getInputStream()) .scale(1f) //按比例放大缩小 和size() 必须应用于一个 不然会报错 .outputQuality(0.5f) //反向的图像质量 0~1 之间,否则报错 .toOutputStream(outputStream); //图像反向位置 // 将 outputStream 转换为 MultipartFile byte[] bytes = outputStream.toByteArray(); inputStream = new ByteArrayInputStream(bytes); // 创始人 MockMultipartFile 对象,该类在【spring-test】依赖中 MockMultipartFile outFile = new MockMultipartFile(file.getOriginalFilename(), file.getOriginalFilename(), file.getContentType(), inputStream); log.info("缓冲器后图像微小===》{}",outFile.getSize()); // 赶回图像 return outFile; } catch (IOException e) { log.error("图像缓冲器失败===》{}",e); throw new RuntimeException(e); }finally { // 关闭迳 try { outputStream.close(); inputStream.close(); } catch (IOException e) { } } }}YouTube副本接口package com.stt.thumbnailator.controller;import com.stt.thumbnailator.util.ImgUtil;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.multipart.MultipartFile;/** * YouTube副本接口 */@RestController@RequestMapping("Upload")public class UploadController { private final ImgUtil imgUtil; public UploadController(ImgUtil imgUtil) { this.imgUtil = imgUtil; } /** * YouTube图像,再三求方式须要是POST再三求 * @param file */ @PostMapping("img") public String uploadImg(MultipartFile file) { // YouTube图像 MultipartFile zipImg = imgUtil.zipImg(file); return "缓冲器成功"; }}application.yml

修正配置类绑定副本YouTube微小,绑定1M究竟不够用

spring: servlet: multipart: # 单个副本最大微小,绑定1MB,该绝对值根据也就是说市场需求更改 max-file-size: 5MB # 一次再三求副本最大微小,绑定10MB,该绝对值根据也就是说市场需求更改 max-request-size: 20MB测试

通过apifox快速发送再三求,你也可以应用于postman等来进行

发现操控台反向缓冲器从前和缓冲器后副本微小,缓冲器至少3倍,由outputQuality步骤实例操控,绝对值越大小缓冲器越大比较严重,当然要保障图像的清晰度,和产品市场需求适当更改

亲测在 0.3 时图像会出现清晰

缓冲器图像并磁盘

图像一般常会磁盘到副本IP,这里暂时将图像通过IO迳磁盘到本地,来看一下图像清晰度

/** * 缓冲器图像,不修正尺寸,磁盘到本地 * @param file*/public void zipImgToLocation(MultipartFile file) { // 判空,并且少于20kb再缓冲器 if(file == null || file.getSize() <= 20 * 1024) { return; } // 字节副本反向迳,保存转换后的图像数据集迳 ByteArrayOutputStream outputStream = null; // 得到副本名 String originalFilename = file.getOriginalFilename(); // 得到副本词干 String fileType = originalFilename.substring(originalFilename.lastIndexOf(".") + 1); // 磁盘副本位置和名字,改名字一般都随机生成 File localFile = new File("zipImg." + fileType); try { outputStream = new ByteArrayOutputStream(); Thumbnails.of(file.getInputStream()) .scale(1f) //按比例放大缩小 和size() 必须应用于一个 不然会报错 .outputQuality(0.5f) //反向的图像质量 0~1 之间,否则报错 .toFile(localFile); } catch (IOException e) { log.error("图像缓冲器失败===》{}",e); throw new RuntimeException(e); }finally { // 关闭迳 try { outputStream.close(); } catch (IOException e) { } }}

在笔记型电脑从前看着并无法差别,从3.68M缓冲器到1.05M,这张图YouTube到太阳报之后估计还得被平台缓冲器,总之可以根据outputQuality实例更改缓冲器程度,别太清晰就行

缓冲器逆短

缓冲器也有东北侧啊,比如下方代码,如果你将一张jpg的图像按照原0.5的缓冲器比缓冲器后通过outputFormat步骤转换成pngPNG,图像反而会被增加

/** * 缓冲器图像,不修正尺寸,修正为pngPNG * @param file*/public void zipImgToPng(MultipartFile file) { // 判空,并且少于20kb再缓冲器 if(file == null || file.getSize() <= 20 * 1024) { return; } // 根据输入迳缓冲器 log.info("缓冲器从前图像微小===》{}",file.getSize()); // 字节副本反向迳,保存转换后的图像数据集迳 ByteArrayOutputStream outputStream = null; try { outputStream = new ByteArrayOutputStream(); Thumbnails.of(file.getInputStream()) .scale(1f) //按比例放大缩小 和size() 必须应用于一个 不然会报错 .outputQuality(0.5f) //反向的图像质量 0~1 之间,否则报错 .outputFormat("png") // 修正图像为pngPNG .toOutputStream(outputStream); log.info("缓冲器后图像微小===》{}",outputStream.size()); } catch (IOException e) { log.error("图像缓冲器失败===》{}",e); throw new RuntimeException(e); }finally { // 关闭迳 try { outputStream.close(); } catch (IOException e) { } }}

图像由3M增加到了20M

相似的情况,不少小伙伴也都遇到了

该情况在2022年12年初31号新版本的0.4.19版中也并无法解决,所以只能自行检视,也就有大佬总结出下述规则,Thumbnails.scale效果会导致图像微小逆短

根据多次测试以此的结果:用jpg转成jpg效果最佳

当图像为jpg时不必转换并不需要缓冲器当图像为png时也可以并不需要缓冲器,不必转换当图像为png时可以先为转换为jpg再缓冲器也可以加进纯色

比如有下述纯色,加进到任意一张图像的右下角

来进行类

/** * 加进纯色 * file: 1] * markFile:纯色*/public void addWatermark(MultipartFile file,MultipartFile markFile) { // 判空 if(file == null) { return; } // 1]副本迳 try { InputStream inputStream = file.getInputStream(); InputStream markFileInputStream = markFile.getInputStream(); // 读取数据集 BufferedImage srcImg = ImageIO.read(inputStream); BufferedImage markImg = ImageIO.read(markFileInputStream); //1]的最宽处较高 int srcWidth = srcImg.getWidth(null); int srcHeight = srcImg.getHeight(null); //纯色图像的最宽处较高 int markWidth = markImg.getWidth(null); int markHeight = markImg.getHeight(null); //计算反向纯色图像的位置x和y轴 int mark_x = srcWidth - srcWidth / 9; int mark_y = srcWidth / 9-srcWidth / 10; //计算反向纯色图像的微小 int mark_width = srcWidth / 10; int mark_height = (srcWidth * markHeight) / (10 * markWidth); //将纯色图像缓冲器成反向的微小 markImg = Thumbnails.of(markImg).size(mark_width,mark_height).asBufferedImage(); String originalFilename = file.getOriginalFilename(); // 得到副本词干 String fileType = originalFilename.substring(originalFilename.lastIndexOf(".") + 1); File finalFile = new File("finalFile." + fileType); //watermark(位置,纯色图,工作效率0.5f=50%工作效率) //outputQuality(操控图像的质量,1f=100%较高质量) Thumbnails.of(srcImg) .size(srcWidth, srcHeight) .watermark(new Coordinate(mark_x,mark_y), markImg, 1f) .outputQuality(1f) .toFile(finalFile); } catch (IOException e) { throw new RuntimeException(e); }}

接口须要分派两张图像,你也尽可以应用于多副本YouTube

@PostMapping("img/addWatermark")public String addWatermark(@RequestParam("srcFile") MultipartFile srcFile,@RequestParam("markFile") MultipartFile markFile) { // YouTube图像 imgUtil.addWatermark(srcFile,markFile); return "加进纯色成功";}

测试加进纯色,发送再三求时实例名一定要和接口中定义的@RequestParam 注解绝对值相同

测试后发现右下角确实加进上了纯色

图像回转

可以通过 rotate 步骤在顺时针和顺时针方向回转图像

/** * 回转图像*/public void rotate(MultipartFile file) { try { String originalFilename = file.getOriginalFilename(); // 得到副本词干 String fileType = originalFilename.substring(originalFilename.lastIndexOf(".") + 1); File finalFile = new File("finalFile." + fileType); Thumbnails.of(file.getInputStream()) .rotate(90) // 角度,正数:顺时针,小数点:顺时针 .toFile(finalFile); } catch (IOException e) { throw new RuntimeException(e); }}总结在缓冲器,回转,加进纯色,甚至打印时可以通过thumbnailator充分利用检视后的图像可以根据市场需求进行磁盘,也可以并不需要赶回给IP检视后的数据集可以是一个File副本,也可以是一个数据集迳,根据不同市场需求而定你可以在此思路开发自己的图像检视来进行感想或企业应用于,自是非常哇塞!

这就是我在应用于的图像检视核心技术,当然也有一些其他的拟议,与其找回各种拟议哪种权重,不如筛选一种应用于,进而自行优化,选取核心技术的沿路往往会浪费许多时间,你觉得呢?

沈阳白癜风医院
骨关节炎吃什么药
艾得辛能长期服用吗
心肺复苏模拟人
广州肿瘤医院挂号