1 需求

表哥需要给儿子报名考试,系统要求上传不超过30KB的图片,而现在的手机随手一拍就是几MB的,怎么弄一个才30KB的图片呢?

一个简单的办法是在电脑上把图片缩小,然后截屏小图片,但现在的电脑屏幕分辨率很高,而且截屏大小不好控制;同样分辨率在不同图片格式下,大小也相差很大。试了一下微信截图工具,输出的图片比较大。于是放弃了该办法。

另一个办法是通过其它工具来处理。找了图片在线压缩网站和一款手机软件,发现在图片小于一定大小时压缩无效。如果再继续找其它工具,简直就是折腾且浪费时间,所以也放弃了该办法。

最后,还是自己写个代码把图片按原比例压缩成了29KB,使用Thumbnailator库,两三行代码搞定。

2 缩略图可以做什么?

缩略图是应用极其广泛的,像头像、图片消息、商品图片等,都会用到缩略图。

比如,当你有了一个新的微信好友,你就能看到他的头像,一开始这个头像是一个比原图更小的缩略图。而你点击查看原图时,微信客户端才会给你下载原图。因为你并不会对每个人的头像都感兴趣,都会去查看清晰的原图,一个小小的缩略图已经能满足了。这样可以减轻网络传输的负担,加快响应速度。

微信传图片和视频也是同样的道理,先给你传一个比较小的预览,你点击查看原图或视频播放才给你传更大的文件。

3 缩略图的开源库

缩略图的开源库很多:

(1)Thumbnailator

不依赖外部库,轻便高效,任何平台适用,支持缩放、旋转、截取,支持水印。

(2)Imgscalr

全部基于 Java 2D,不依赖外部库,轻便高效,任何平台适用,支持缩放、旋转、截取,不支持水印。

本文主要讲解Thumbnailator的使用,最新版本为0.4.8,maven引入如下:

net.coobird

thumbnailator

0.4.8

4 常用操作

4.1 指定大小缩放

原图为4:3比例的图片,为4032x3024(图片太大,网站无法上传原图),如下:

当使用指定大小方式进行缩放时,默认是保持原比例的。

//参数小且比例与原比例一样

//则按参数输出结果

Thumbnails.of(originalPic)

.size(400, 300)

.toFile(picturePath + "climb-up.size.400X300.jpeg");

//参数大且比例不等

//则按比例放大,取最小的值

Thumbnails.of(originalPic)

.size(4400, 3400)

.toFile(picturePath + "climb-up.size.4400X3300.jpeg");

//参数小且比例不等

//则按比例缩小,取最小的值

Thumbnails.of(originalPic)

.size(200, 300)

.toFile(picturePath + "climb-up.size.200X150.jpeg");

//不保持比例

//则按参数输出结果

Thumbnails.of(originalPic)

.size(200, 300)

.keepAspectRatio(false)

.toFile(picturePath + "climb-up.size.notKeepRatio.200X300.jpeg");

//强制设置大小

//则按参数输出结果,与上个例子一样

Thumbnails.of(originalPic)

.forceSize(200, 300)

.toFile(picturePath + "climb-up.forceSize.200X300.jpeg");

展示其中两种结果:

(1)size(200, 300),结果为200X150的图片,比例还是4:3。

(2)forceSize(200, 300),结果为200X300的图片,如原比例不同,会有变形。

4.2 按比例进行缩放

按比例进行缩放是指按宽和高的比例同时缩放,看下面代码:

//比例小于1,缩小

//宽和高同时缩小为原来的0.1倍

Thumbnails.of(originalPic)

.scale(0.1f)

.toFile(picturePath + "climb-up.scale.403X302.jpeg");

//比例大于1,放大

//宽和高同时放大为原来的1.1倍

Thumbnails.of(originalPic)

.scale(1.1f)

.toFile(picturePath + "climb-up.scale.4435X3326.jpeg");

4.3 按角度旋转

按角度旋转时,角度为正数时,顺时针;角度为负数时,逆时针。代码如下:

Thumbnails.of(originalPic)

.size(400,300)

.rotate(45)

.toFile(picturePath + "climb-up.rotate.45.jpeg");

压缩并旋转后的结果图片如下所示:

4.4 添加水印

添加水印也是十分方便,我们示例将水印放在右上角,代码如下:

Thumbnails.of(originalPic)

.size(2000,1500)

.watermark(Positions.TOP_RIGHT, ImageIO.read(

new File(picturePath + "pkslow.size.400X300.jpeg")), 0.5f)

.toFile(picturePath + "climb-up.watermark.jpeg");

加上水印后的图片如下:

4.5 裁剪

代码如下:

Thumbnails.of(originalPic)

.sourceRegion(Positions.TOP_RIGHT, 1800, 1800)

.size(400, 400)

.toFile(picturePath + "climb-up.crop.jpeg");

结果如下:

4.6 目录下的文件批量操作

这个功能还是非常有用,可以操作目录下的所有图片,并指定文件名输出,如指定前缀,代码如下:

Thumbnails.of(new File("/pictures/201912/").listFiles())

.size(400, 400)

.toFiles(Rename.PREFIX_DOT_THUMBNAIL);

操作后的生成的结果如下:

5 总结

Thumbnailator库操作方便,支持缩放、旋转、裁剪、水印等功能,而且没有其它依赖,值得了解学习。

欢迎关注公众号,将持续为你更新...

多读书,多分享;多写作,多整理。

java 图片旋转裁剪_【Java实例】使用Thumbnailator生成缩略图(缩放、旋转、裁剪、水印)...相关推荐

  1. java 图片宽高_[Java]获取图片高和宽

    通过javax.imageio.ImageIO类中的read()函数读取的图片,存放在类java.awt.image.BufferedImage类中.调用BufferedImage类中的getWidt ...

  2. Java苹果手机缩略图旋转_Java实例使用Thumbnailator生成缩略图(缩放、旋转、裁剪、水印)...

    1 需求 表哥需要给儿子报名考试,系统要求上传不超过30KB的图片,而现在的手机随手一拍就是几MB的,怎么弄一个才30KB的图片呢? 一个简单的办法是在电脑上把图片缩小,然后截屏小图片,但现在的电脑屏 ...

  3. java图片简单爬虫_[Java教程]使用jsoup进行简单的爬虫操作爬取图片

    [Java教程]使用jsoup进行简单的爬虫操作爬取图片 0 2015-12-01 17:00:27 package com.guanglan.util;import java.io.File;imp ...

  4. js java 图片上传_spring(java,js,html) 截图上传图片实例详解

    html 最后 上传了这个插件 共学习参考 function addFile(obj){ //document.getElementById('img').src = path; $.ajaxFile ...

  5. java 图片识别提取_老司机帮您Java 提取/读取PDF中的图片

    电脑现已成为我们工作.生活和娱乐必不可少的工具了,在使用电脑的过程中,可能会遇到Java 提取/读取PDF中的图片的问题,如果我们遇到了Java 提取/读取PDF中的图片的情况,该怎么处理怎么才能解决 ...

  6. java 图片处理框架_使用图片框处理图片。

    java 图片处理框架 将两个图片框添加到窗体. 将两个图片框的ScaleMode属性设置为3像素. 一般声明 -------------------------------- Const ubx = ...

  7. java 基础面试 英文_[Java面试] 面试java基础总结大全

    原标题:[Java面试] 面试java基础总结大全 基础知识: 1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. ...

  8. java 字符串格式替换_[Java] - 格式字符串替换方法

    Java 字符串格式替换方法有两种,一种是使用String.format(...),另一种是使用MessageFormat.format(...) 如下: import java.text.Messa ...

  9. java 内存泄露 书籍_[Java教程]一次艰难的内存泄露排查,BeanUtils 的锅

    [Java教程]一次艰难的内存泄露排查,BeanUtils 的锅 0 2020-10-29 18:24:42 现象 通过jstat -gcutil pid 5000 ,发现fgc次数很多而且频繁,此时 ...

  10. java 历遍 类_[Java] 遍历指定包名下所有的类(支持jar) | 学步园

    项目需要,仅做记录. 支持包名下的子包名遍历,并使用Annotation(内注)来过滤一些不必要的内部类,提高命中精度. 通过Thread.currentThread().getContextClas ...

最新文章

  1. 旷视MegEngine基本概念
  2. java mysql 查询结果_JAVA中显示MYSQL查询结果
  3. 2020 年 5 大 DevOps 趋势
  4. BZOJ2705 [SDOI2012]Longge的问题 欧拉函数
  5. mac安装QT及QT基本使用
  6. java实现选择排序 带打印,选择排序算法的JAVA实现
  7. NEERC13 Problem H.Hack Protection
  8. 数学生物学:生命是数字游戏
  9. 设计模式之二装饰者模式
  10. LOCK - 明确地锁定一个表
  11. 学习VIM之2014
  12. 超简单的Springboot中的日志管理配置
  13. 获取电脑上连接的USB打印机
  14. 什么是Alpha通道?
  15. chrome浏览器加载图片失败问题
  16. json格式转数组过程数值改变的问题
  17. 最近遇到的异常与错误总结
  18. 阿里云Elasticsearch搜索
  19. 语义分析(semantic analysis)概述
  20. Ripple(瑞波) JavaScript(node.js) 客户端接口库RippleAPI

热门文章

  1. 项目开发中遇到的问题,原因,解决思路
  2. 一道面试题,设计电路,set,reset
  3. 【lpxt】笔者支招:九招搞定显示器黑屏
  4. zencart 批量修改价格
  5. VMwareESX上的SCOM控制台无法正常运行
  6. 如何解决api接口的并发问题?
  7. Java实现mysql的读写分离
  8. 【PHP基础】PHP接口调用与json数据处理
  9. Python结合selenium自动领取无忧币的脚本
  10. java程序员学习路线图 java程序员进阶路线