前言

由于公司业务需求, 需要解决图片过大加载过慢的问题。这个问题呢首先给大家描述一下,起初是上传图片时将图片转换为base64保存至数据库存储的。 然后获取的时候会直接取出来base64转换图片展示,这样就发现上传的图片如果过大, 公司网络加载是会很慢的。 所以想到一个办法就是 上传时将图片压缩, 压缩后的和压缩之前的都保存下来。 然后默认展示压缩后的图片,然后点击图片时再去查出来原始图片的base64。最终博主找到可以利用thumbnailator对图片进行压缩。

正文

由于公司网络带宽差不多是100多kb,所以目前博主的设计方案是 如果图片大于128kb的话,就将图片压缩至128kb以下。我找到google有个插件thumbnailator可以满足我们的需求。 首先我们来看一下这个插件(Thumbnails类源码 of方法):

我们可以看到它的参数是源文件,也就是你初始的图片,准备编辑的图片。它有几个重载的方法,我们可以分别传入这些参数,我的项目需要用流,所以我传进去了一个ByteArrayInputStream对象。

他还有个方法是.scale()方法,它有两个重载:

单个参数的是宽高都按照相同的比例缩放。两个参数的方法var1是给宽度设置缩放比,var3是给高度设置缩放比。

最后一个是to*();这个方法是你压缩完之后,输出的格式,它有这几个方法:

这几个方法就可以满足我们的需求了。

下面贴一下我写的util代码,一共两个方法:

/**

* 根据指定大小压缩图片

*

* @param imageBytes 源图片字节数组

* @param desFileSize 指定图片大小,单位kb

* @return 压缩质量后的图片字节数组

*/

public static byte[] compressPicForScale(byte[] imageBytes, long desFileSize) {

if (imageBytes == null || imageBytes.length <= 0 || imageBytes.length < desFileSize * 1024) {

return null;

}

long srcSize = imageBytes.length;

double accuracy = getAccuracy(srcSize / 1024);

try {

while (imageBytes.length > desFileSize * 1024) {

ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);

ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length);

Thumbnails.of(inputStream)

.scale(accuracy)

.outputQuality(accuracy)

.toOutputStream(outputStream);

imageBytes = outputStream.toByteArray();

}

log.info("【图片压缩】| 图片原大小={" + srcSize / 1024 + "}kb | 压缩后大小={" + imageBytes.length / 1024 + "}kb | ");

} catch (Exception e) {

log.error("【图片压缩】msg=图片压缩失败!" + e);

DefaultMonitorImpl.pushException("【图片压缩】msg=图片压缩失败!" + e);

}

return imageBytes;

}

/**

* 自动调节精度(经验数值)

*

* @param size 源图片大小

* @return 图片压缩质量比

*/

private static double getAccuracy(long size) {

double accuracy;

if (size < 900) {

accuracy = 0.85;

} else if (size < 2047) {

accuracy = 0.6;

} else if (size < 3275) {

accuracy = 0.44;

} else {

accuracy = 0.4;

}

return accuracy;

}

这里解释一下,getAccuracy方法的作用是根据我们指定的图片大小来判断一下scale方法需要的精度是多少。这个是博主从这个博客上看到的。感觉很好用。

下面看一下原图和压缩后图片的效果(原图(左),压缩图(右)):

可以看到压缩效果还是不错的,而且压缩过程也不会特别慢。

2M的图片压缩至28kb 用时1秒。

而且Thumbnails里面还有一些其他的方法,大家有兴趣的可以去看一下源码。

java 图片压缩100k_Java 图片压缩至指定大小相关推荐

  1. html600像素宽如何设置,如何设置图片打印尺寸,长与宽指定大小(CM)?

    此方法为个人观点仅供参考,具体操作步骤如下: 1.首先我们要打开图片编辑软件,点击"文件"选择打开. 2.接下来我们再来打开图片. 3.然后我们要再打开计算器功能. 4.图片宽60 ...

  2. 上传图片到OSS,并按指定大小范围压缩图片。完整工具类+三层调用

    使用阿里的Oss服务器,做图片服务器. 项目功能为,前端,调用后端的接口,上传用户的图片! 1.controller类 @RestController @RequestMapping("/o ...

  3. java图像处理002---JAVA图片压缩_图片缩放_图片按照比例缩放_图片指定长宽缩放_Java使用google开源工具Thumbnailator实现图片压缩

    JAVA技术交流QQ群:170933152 前言 作为靠谱的java服务端程序员,图片这个事情一直是个头疼的事情. 现在很多网站上,都有上传图片这个功能,而图片对于现在的很多手机来说,拍摄出来的都是高 ...

  4. java 压缩图片至指定大小

    需求: 压缩图片至300k以下 一开始没有思路在网上搜,发现google有个插件叫Thumbnails,然后看到了这篇文章: https://blog.csdn.net/u010355502/arti ...

  5. 压缩图片大小的java代码_java按比例压缩图片的源代码,用java如何把图片处理到指定大小...

    [要分析某个网页中的代码构成,需要某个结点下的内容.用此原始方法可以得到整个网页的源码.其实更简单的方法是使用 WebClient 或 HtmlUtil 等开源方式 .public class Ht ...

  6. Java图片压缩工具类(递归压缩到指定大小范围)

    Java图片压缩工具 工具类使用场景 公司做人脸识别项目时候需要上传学生.家长.教师.访客的正面照图片,但是人脸识别机器有限制只接收200KB-1M的图片,所以必须做图片压缩到指定范围大少. APP上 ...

  7. java jsoup抓取百度图片保存到本地,并压缩到指定大小(可指定宽高或者流大小)

    代码如下: package cn.xyz.commons.utils; import java.awt.image.BufferedImage; import java.io.ByteArrayInp ...

  8. java 图片压缩100k_java实现图片压缩

    简介 我们在项目中经常会遇到图片上传的需求,如商品图片,但图片太大的话,在客户端加载太慢影响用户体验,所有一般会将图片进行压缩. 实现 原图 添加依赖 net.coobird thumbnailato ...

  9. JAVA根据指定大小压缩图片

    /*** 根据指定大小压缩图片** @param sourceFilePath 源图片路径 + 文件名(例 "D:\\image\\aa.jpg")* @param outFile ...

  10. JAVA图片压缩指定大小范围

    图片压缩指定大小范围 图片压缩之后存在上下误差,不影响使用 @RequestMapping(value="/compress",method=RequestMethod.POST) ...

最新文章

  1. C#设置本地网络(DNS、网关、子网掩码、IP)
  2. python管理系统-员工管理系统源程序(python实现)
  3. Cent0S 7上的图形安装
  4. FTPClient.listFiles() 放到linux上,返回值为null或数组长度为0
  5. C/C++ 函数指针调用函数
  6. python装饰器传递参数_Python装饰器高级版—Python类内定义装饰器并传递self参数...
  7. es6 Proxy.revocable()方法
  8. CVS的几个学习小站及配置说明
  9. android 访问web.py,Appium 测试 Android 时,python 用例调用 Webdriver.remote 后无回应
  10. 求数组第二大元素 和 字符串拷贝的实现
  11. H5版俄罗斯方块(3)---游戏的AI算法
  12. C#之http transfer-Encoding模式
  13. quartz定时器corn表达式
  14. 今日头条mysql面试题_【今日头条】测试工程师面试题
  15. QT QComboBox使用详解
  16. a0图框标题栏尺寸_机械制图标准中规定的标题栏尺寸
  17. 安装cude11.2.exe报错:Could not create file “C: )Users\xxx\ AppData \Local\ Temp \CUDA\GFExperience
  18. 计算机怎么合并单元格并保存内容,怎么合并单元格并保留所有数据
  19. 硬件设计3---什么是电容?
  20. JavaScript系列之内置对象Object

热门文章

  1. Ubuntu14.04/16.04安装Dukto
  2. 20135202闫佳歆——信息安全系统设计基础第九周学习总结
  3. 同文输入法 android,同文输入法
  4. java知识竞赛题库_java程序设计题库
  5. wkt文件java解析_WKT文件解析 以及各个投影坐标的wkt参数查询
  6. Unity 自定义扩展Hierachy右键菜单
  7. 我研究了3年,终于找出2021年完美的听歌方案!
  8. 中级软件测试工程师是什么水平,中级软件测试工程师需要满足的基本评定条件...
  9. unity中实现多人联机局域网-基于pun v2 + photon server v5
  10. 游戏测试基础:适配性测试