文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java 中如何对图片进行压缩处理

2023-08-31 13:38

关注

问题背景

图片过大时,会造成页面卡顿甚至于报错,而且现在页面,接口,很多地儿都有报文传输的最大限制要求,另外不知道各位有没有遇到过页面渲染比较大的 base64 图片时,会非常的卡顿。所以,我们必须对用户上传的原始图片进行压缩处理。


为何图片经过 base64 编码转换后文件会变大?

图片经过base64编码转换后,文件会变大的原因是因为base64编码会将每个3字节的数据转换成4字节的数据,并且在转换的过程中还会添加一些额外的字符。这些额外的字符包括"="、"+"、"/"等,它们在原始的图片数据中是不存在的。

因此,当我们将图片进行base64编码后,会使得数据变得更大,因为它需要更多的字符来表示相同的原始数据。

另外,使用base64编码也会导致网络传输速度变慢,因为相同的数据需要传输更多的字符。因此,在需要传输大量数据的情况下,建议使用原始的二进制数据,而不是进行base64编码。


 

解决方案

先读取源图片

        new ImgCompress(srcFilePath);

进行图片压缩

        resize(int w, int h, String toPic)

源码工具类如下:

package com.example.util;import java.awt.image.BufferedImage;import com.sun.image.codec.jpeg.JPEGCodec;import com.sun.image.codec.jpeg.JPEGImageEncoder;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import javax.imageio.ImageIO;@SuppressWarnings("restriction")public class ImgCompress {static BufferedImage img = null;public static void main(String[] args) throws IOException {String fromPic = "C:\\Users\\86183\\Pictures\\儿童节插画手绘人物.png";String toPic = "C:\\Users\\86183\\Pictures\\儿童节插画手绘人物_min.png";ImgCompress imgCom = new ImgCompress(fromPic );imgCom.resize(400, 400, toPic);}public ImgCompress(String fileName) throws IOException {     File file = new File(fileName);// 读入文件     img = ImageIO.read(file);      // 构造Image对象}public void resize(int w, int h, String toPic) throws IOException {// SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的 优先级比速度高 生成的图片质量比较好 但速度慢    BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);    image.getGraphics().drawImage(img, 0, 0, w, h, null); // 绘制缩小后的图    File destFile = new File(toPic);    FileOutputStream out = new FileOutputStream(destFile); // 输出到文件流    // 可以正常实现bmp、png、gif转jpg    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);    encoder.encode(image); // JPEG编码    out.close();}}

备注

这里我们用到了 jdk 下的依赖包

import com.sun.image.codec.jpeg.JPEGCodec;import com.sun.image.codec.jpeg.JPEGImageEncoder;

那 maven 打包时 为何 jdk 下的包打包不进去?

如果你的maven项目中依赖了JDK下的包,但是在打包时这些包没有被打包进去,可能是因为maven默认只会把项目中依赖的jar包打包进去,而JDK下的包被认为是系统级别的依赖,不会自动加入打包的jar中。

为了解决这个问题,有两种常用的方法:

引入JDK包的maven依赖
你可以在pom.xml中加入类似下面的依赖,把JDK下的包引入到maven项目中,这样就能够被打包进去了:

    jdk.tools    jdk.tools    ${java.version}    system    ${java.home}/lib/tools.jar

手动添加JDK包
如果不想引入依赖,也可以手动将JDK下的包添加到打包的jar文件中,可以在maven打包命令中加入以下参数:

mvn package -Dmaven.compiler.includeJavaxPackages=true

这样打包时就会包含JDK下的包了。


maven 打包时,会提示找不到该包,这里我们需要在 maven 的 POM 文件里添加一个打包依赖的设置项。

org.apache.maven.pluginsmaven-compiler-plugin${java.version}${java.version}UTF-8                                              ${java.home}/lib/rt.jar;${java.home}/lib/jce.jar                   

 添加的位置如下: 

 附加内容:前端 Jquery 和 后台 Java 判断文件大小的方式。

前端:
var fileSize = $("#"+fileId)[0].files[0].size/(1024*1024);console.log("上传文件大小:"+fileSize+"M");

上面变量 fileId 就是文件 file 输入框的 id 值。

后端:
public static boolean checkFileSizeIsLimit(Long fileLen, int fileSize, String fileUnit) {      double fileSizeCom = 0;      if ("B".equals(fileUnit.toUpperCase())) {          fileSizeCom = (double) fileLen;      } else if ("K".equals(fileUnit.toUpperCase())) {          fileSizeCom = (double) fileLen / 1024;      } else if ("M".equals(fileUnit.toUpperCase())) {          fileSizeCom = (double) fileLen / (1024*1024);      } else if ("G".equals(fileUnit.toUpperCase())) {          fileSizeCom = (double) fileLen / (1024*1024*1024);      }      if (fileSizeCom > fileSize) {          return false;      }      return true;  }

直接用工具类即可,代码简单明了,也没啥太多可说明和备注的。

来源地址:https://blog.csdn.net/weixin_36754290/article/details/131381415

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯