应用场景

在和腾讯广点通交互生成视频的智能封面时,由于返回的智能封面图片的大小太大超出了限制,因此需要把图片压缩大小后再上传至腾讯

关于图片压缩的解决方案

在这里我主要使用的是Thumbnails来进行图片的压缩,下面会简单介绍一下工具类的使用。

  • 依赖
<dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.8</version>
</dependency>
  • 指定大小进行缩放
         /** size(width,height) 若图片横比200小,高比300小,不变* 若图片横比200小,高比300大,高缩小到300,图片比例不变 若图片横比200大,高比300小,横缩小到200,图片比例不变* 若图片横比200大,高比300大,图片按比例缩小,横为200或高为300*/Thumbnails.of("images/test.jpg").size(200, 300).toFile("image/image_200x300.jpg");Thumbnails.of("images/test.jpg").size(2560, 2048).toFile("image/image_2560x2048.jpg");
  • 按照比例进行缩放
     /*** scale(比例)*/Thumbnails.of("images/test.jpg").scale(0.25f).toFile("images/image_25%.jpg");Thumbnails.of("images/test.jpg").scale(1.10f).toFile("images/image_110%.jpg");
  • 不按照比例,指定大小进行缩放
     /*** keepAspectRatio(false) 默认是按照比例缩放的*/Thumbnails.of("images/test.jpg").size(120, 120).keepAspectRatio(false).toFile("images/image_120x120.jpg");
  • 旋转
     /*** rotate(角度),正数:顺时针 负数:逆时针*/Thumbnails.of("images/test.jpg").size(1280, 1024).rotate(90).toFile("images/image+90.jpg");Thumbnails.of("images/test.jpg").size(1280, 1024).rotate(-90).toFile("images/iamge-90.jpg");
  • 水印
         /*** watermark(位置,水印图,透明度)*/Thumbnails.of("images/test.jpg").size(1280, 1024).watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("images/watermark.png")), 0.5f).outputQuality(0.8f).toFile("images/image_watermark_bottom_right.jpg");Thumbnails.of("images/test.jpg").size(1280, 1024).watermark(Positions.CENTER, ImageIO.read(new File("images/watermark.png")), 0.5f).outputQuality(0.8f).toFile("images/image_watermark_center.jpg");
  • 裁剪
         /*** 图片中心400*400的区域*/Thumbnails.of("images/test.jpg").sourceRegion(Positions.CENTER, 400, 400).size(200, 200).keepAspectRatio(false).toFile("images/image_region_center.jpg");/*** 图片右下400*400的区域*/Thumbnails.of("images/test.jpg").sourceRegion(Positions.BOTTOM_RIGHT, 400, 400).size(200, 200).keepAspectRatio(false).toFile("images/image_region_bootom_right.jpg");/*** 指定坐标*/Thumbnails.of("images/test.jpg").sourceRegion(600, 500, 400, 400).size(200, 200).keepAspectRatio(false).toFile("images/image_region_coord.jpg");
  • 转化图像格式
     /*** outputFormat(图像格式)*/Thumbnails.of("images/test.jpg").size(1280, 1024).outputFormat("png").toFile("images/image_1280x1024.png");Thumbnails.of("images/test.jpg").size(1280, 1024).outputFormat("gif").toFile("images/image_1280x1024.gif");

具体使用

  1. 根据图片的url获取HttpConnection
    private HttpURLConnection getImageInputStream(String imageUrl) {try {URL url = new URL(imageUrl);URLConnection urlConnection = url.openConnection();HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;httpURLConnection.setConnectTimeout(1000 * 5);httpURLConnection.connect();return httpURLConnection;} catch (Exception e) {e.printStackTrace();throw new ManageException("获取图片HttpConnection失败");}}
  1. 获取图片大小
在这里我们使用httpURLConnection.getContentLength()获取图片的总大小
而不是使用httpURLConnection.getInputStream().available()获取图片大小,因为可能存在网络波动从流中获取数据的大小只是一部分,并不能获取总的大小,但是如果是把图片先下载下来再用这个方法获取大小,那是可以的
  1. 压缩图片
Thumbnails.of(httpURLConnection.getInputStream()).scale(1f).outputQuality(qulity).toFile(dirPath + fileName);

分享几个经常用的转换工具

  • 根据url获取对应的base64
public static String getBase64ByUrl(String urlPath) {ByteArrayOutputStream data = new ByteArrayOutputStream();try {URL url = new URL(urlPath);byte[] by = new byte[1024];URLConnection urlConnection = url.openConnection();HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;httpURLConnection.setConnectTimeout(1000 * 5);httpURLConnection.connect();InputStream inputStream = httpURLConnection.getInputStream();int len;while ((len = inputStream.read(by)) != -1) {data.write(by, 0, len);}inputStream.close();} catch (Exception e) {e.printStackTrace();}return Base64.getMimeEncoder().encodeToString(data.toByteArray());}
  • 文件转字节数组
    public static byte[] fileToBytes(File file) {byte[] fileBytes = null;FileInputStream fis = null;try {fis = new FileInputStream(file);fileBytes = new byte[(int) file.length()];fis.read(fileBytes);fis.close();} catch (Exception e) {e.printStackTrace();}return fileBytes;}
  • 根据字节数组获取MD5
    public static String getFileSignature(byte[] fileBytes) {MessageDigest digest = null;try {digest = MessageDigest.getInstance("MD5");digest.update(fileBytes);byte[] encryptBytes = digest.digest();return HexHelper.toHexString(encryptBytes);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return null;}

Thumbnails压缩图片相关推荐

  1. java使用Thumbnails压缩图片

    java使用Thumbnails压缩图片 有时候为了缓解服务器上的存储压力,我们需要将图片进行压缩以换取空间. 下面使用的是google提供的压缩方式: 一.导包 <!-- 压缩图片大小 --& ...

  2. 记一次摸不着头脑的FullGC问题 (Thumbnails压缩图片占用巨大内存)

    问题现象 首先用户反映,有数据不一致情况产生,为了查询什么原因导致的数据不一致问题, 扒拉出来日志看了一通,发现有个简单的查询耗时特别长,平时只要几ms返回结果的 确调用了200多s,查了各个服务的日 ...

  3. Thumbnails压缩图片到指定大小

    网上看了很多demo,很多都是照搬别人的代码,不管有没有问题,有的甚至递归不关流,还有的递归疯狂往自己磁盘写文件,递归一次写一次,我自己把网上的demo整理改了下发出来. /** * @Descrip ...

  4. 使用 Thumbnails 压缩图片

    PC上线的商城,最近推出了手机版(App & 微信公众号) 商品图片之前适配的PC版,尺寸较大,在手机端直接浏览会比较占用比较高的带宽导致速度变慢,本想让美工重新上传手机适配版的,商品繁多,重 ...

  5. thumbnailator压缩图片并存至Excel单元格代码

    文章目录 依赖 压缩图片工具类: 存至excel的转化器 Excel导入导出的数据类 将数据库实体转化为excel实体 依赖 <dependency><groupId>com. ...

  6. 通过google插件Thumbnails实现图片指定大小压缩

    前言: 1.由于商户进件时,上游对图片大小有要求(500kb以下),而我们平台图片过大(10M以上),所以必须通过程序将图片压缩后再上传: 2.java api可以通过ImageIO实现图片压缩,但效 ...

  7. 使用Thumbnails等比例压缩图片

    如何使用Thumbnails等比例压缩图片 我是用MultipartFile来接收文件的 具体思路 直接上代码 我是用MultipartFile来接收文件的 最近项目中有一个需要是需要把上传的图片进行 ...

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

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

  9. 浅谈Thumbnails压缩gif图片质量的实现方式

    Thumbnails是一个比较大众的图片处理工具,类似的工具还有hutool,可以对图片进行裁剪.缩放.旋转.格式转换.水印等.然而它只提供单张图片的压缩,对于gif的压缩,却是需要我们自己去处理. ...

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

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

最新文章

  1. 2020-10-26(安卓逆向开篇)
  2. 由病毒引发的肠胃感冒
  3. android 代码签名apk,[Android]混淆代码后生成带签名的apk
  4. 正能量,让网络空间释放更多善意
  5. [ECMAScript] 说说你对set数据结构的理解
  6. 【读书笔记】周志华《机器学习》第三版课后习题讨第一章-绪论
  7. python读取txt文件每一行_Python3基础 file for+list 读取txt文本 并 一行一行的输出(低效率)...
  8. python 统计英文词频
  9. 算法导论2.3练习答案
  10. iOS oc对网络图片进行黑白化处理
  11. 判断矩形是否重叠 Python
  12. Ubuntu10.10下安装Tor,PolipoVidalia
  13. w3c标准的深入理解
  14. 解决java网络编程IPv6问题
  15. SAP 选择屏幕下拉框实现
  16. word固定行距mathtype显示不全问题解决方法
  17. Linux下poky编译2
  18. IOS 生成本地验证码
  19. 关于异步log4j2中location信息打印问题
  20. maven下载依赖失败

热门文章

  1. 云服务器被恶意ddos攻击了怎么办?
  2. 论文笔记:OntoED: Low-resource Event Detection with Ontology Embedding
  3. 一年级下册计算机教学计划,一年级科学下册教学计划
  4. D-Tale,实现Pandas GUI高效数据分析
  5. python --通过urlretrieve下载MP4文件
  6. openssl的x509命令简单入门
  7. HDU 4889 Scary Path Finding Algorithm
  8. 江西财大计算机研究生是统考,江西财经大学计算机技术在职研究生招生简章
  9. 【LeetCode】马三来刷题之Permutations
  10. 投射电子显微镜(TEM)