我们在java开发时,使用Thumbnails工具类能帮助我们对图片进行很好的处理,Thumbnails对图片的操作进行了很好的封装,往往很复杂的步骤能用一行代码就完成。 
Thumbnails支持:

·指定大小进行缩放
·按照比例进行缩放
·不按照比例,指定大小进行缩放
·旋转
·水印
·裁剪
·转化图像格式
·输出到OutputStream
·输出到BufferedImage

使用步骤

  1. 导入架包
<dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.8</version></dependency>

2.具体使用方法

/*** 指定大小进行缩放* * @throws IOException*/private void test1() throws IOException {/** size(width,height) 若图片横比200小,高比300小,不变* 若图片横比200小,高比300大,高缩小到300,图片比例不变 若图片横比200大,高比300小,横缩小到200,图片比例不变* 若图片横比200大,高比300大,图片按比例缩小,横为200或高为300*/Thumbnails.of("images/test.jpg").size(200, 300).toFile("C:/image_200x300.jpg");Thumbnails.of("images/test.jpg").size(2560, 2048).toFile("C:/image_2560x2048.jpg");}/*** 按照比例进行缩放* * @throws IOException*/private void test2() throws IOException {/*** scale(比例)*/Thumbnails.of("images/test.jpg").scale(0.25f).toFile("C:/image_25%.jpg");Thumbnails.of("images/test.jpg").scale(1.10f).toFile("C:/image_110%.jpg");}/*** 不按照比例,指定大小进行缩放* * @throws IOException*/private void test3() throws IOException {/*** keepAspectRatio(false) 默认是按照比例缩放的*/Thumbnails.of("images/test.jpg").size(120, 120).keepAspectRatio(false).toFile("C:/image_120x120.jpg");}/*** 旋转* * @throws IOException*/private void test4() throws IOException {/*** rotate(角度),正数:顺时针 负数:逆时针*/Thumbnails.of("images/test.jpg").size(1280, 1024).rotate(90).toFile("C:/image+90.jpg");Thumbnails.of("images/test.jpg").size(1280, 1024).rotate(-90).toFile("C:/iamge-90.jpg");}/*** 水印* * @throws IOException*/private void test5() throws IOException {/*** 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("C:/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("C:/image_watermark_center.jpg");}/*** 裁剪* * @throws IOException*/private void test6() throws IOException {/*** 图片中心400*400的区域*/Thumbnails.of("images/test.jpg").sourceRegion(Positions.CENTER, 400, 400).size(200, 200).keepAspectRatio(false).toFile("C:/image_region_center.jpg");/*** 图片右下400*400的区域*/Thumbnails.of("images/test.jpg").sourceRegion(Positions.BOTTOM_RIGHT, 400, 400).size(200, 200).keepAspectRatio(false).toFile("C:/image_region_bootom_right.jpg");/*** 指定坐标*/Thumbnails.of("images/test.jpg").sourceRegion(600, 500, 400, 400).size(200, 200).keepAspectRatio(false).toFile("C:/image_region_coord.jpg");}/*** 转化图像格式* * @throws IOException*/private void test7() throws IOException {/*** outputFormat(图像格式)*/Thumbnails.of("images/test.jpg").size(1280, 1024).outputFormat("png").toFile("C:/image_1280x1024.png");Thumbnails.of("images/test.jpg").size(1280, 1024).outputFormat("gif").toFile("C:/image_1280x1024.gif");}/*** 输出到OutputStream* * @throws IOException*/private void test8() throws IOException {/*** toOutputStream(流对象)*/OutputStream os = new FileOutputStream("C:/image_1280x1024_OutputStream.png");Thumbnails.of("images/test.jpg").size(1280, 1024).toOutputStream(os);}/*** 输出到BufferedImage* * @throws IOException*/private void test9() throws IOException {/*** asBufferedImage() 返回BufferedImage*/BufferedImage thumbnail = Thumbnails.of("images/test.jpg").size(1280, 1024).asBufferedImage();ImageIO.write(thumbnail, "jpg", new File("C:/image_1280x1024_BufferedImage.jpg"));}

压缩图片至指定大小

一开始没有思路在网上搜,发现google有个插件叫Thumbnails,然后看到了这篇文章:

https://blog.csdn.net/u010355502/article/details/77197616

思路很简单,按一定的比例压缩图片,如果压缩完大小达不到要求,就把压缩后的结果继续压缩,直到符合要求为止

本文可以说是对原文作者代码的改进,去除了一些多余的IO过程,把递归改成了循环,并且把文件操作改为了流和字节数组的操作(也是更符合公司的业务代码一些)

在此感谢原文作者


import net.coobird.thumbnailator.Thumbnails;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;/*** 图片压缩Utils** @author worstEzreal* @version V1.1.0* @date 2018/3/12*/
public class PicUtils {private static Logger logger = LoggerFactory.getLogger(PicUtils.class);//    public static void main(String[] args) throws IOException {
//        byte[] bytes = FileUtils.readFileToByteArray(new File("D:\\1.jpg"));
//        long l = System.currentTimeMillis();
//        bytes = PicUtils.compressPicForScale(bytes, 300, "x");// 图片小于300kb
//        System.out.println(System.currentTimeMillis() - l);
//        FileUtils.writeByteArrayToFile(new File("D:\\dd1.jpg"), bytes);
//    }/*** 根据指定大小压缩图片** @param imageBytes  源图片字节数组* @param desFileSize 指定图片大小,单位kb* @param imageId     影像编号* @return 压缩质量后的图片字节数组*/public static byte[] compressPicForScale(byte[] imageBytes, long desFileSize, String imageId) {if (imageBytes == null || imageBytes.length <= 0 || imageBytes.length < desFileSize * 1024) {return imageBytes;}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();}logger.info("【图片压缩】imageId={} | 图片原大小={}kb | 压缩后大小={}kb",imageId, srcSize / 1024, imageBytes.length / 1024);} catch (Exception e) {logger.error("【图片压缩】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;}}

Thumbnails使用方法(图片处理工具类)相关推荐

  1. Java实现pdf转图片的工具类(三种方法实现PDF转图片的案例)【亲测可用】

    提示:有些时候我们需要在项目中展示PDF,所以我们可以将PDF转为图片,然后已图片的方式展示,效果很好.Java使用各种技术将pdf转换成图片格式,并且内容不失帧.清晰可见,该工具类也是开发中常用到的 ...

  2. 图片处理工具类 - ImageUtils.java

    纯JAVA实现的图片处理工具类,提供图片的裁剪.压缩.获取尺寸.制作圆角等方法. 源码如下:(点击下载 -ImageUtils.java .FolderUtils.java .commons-io-2 ...

  3. Android 图片处理工具类封装2

    http://www.2cto.com/kf/201312/263638.html Android 图片处理工具类封装 2013-12-10     0个评论   来源:Wiker Yong 的专栏  ...

  4. linux 图片编辑 java_Java的图片处理工具类

    Java的图片处理工具类: 可实现以下常用功能:缩放图像.切割图像.图像类型转换.彩色转黑白.文字水印.图片水印等 import java.awt.AlphaComposite; import jav ...

  5. java图片处理工具类,很实用哦

    笔者以前在项目里要求处理图片,当时在博客里看到这篇不错的帖子,但是没有看到原作的出处,于是就不客气的转载下来了...同时感谢原创写出这么好的东西. 这个图像工具类可实现以下常用功能:缩放图像.切割图像 ...

  6. 阿里的图片剪裁工具类及依赖的jar包

    阿里的图片剪裁工具类包含以下7个方法,这都好理解,关键是这个jar包的maven依赖不好找,有人卖这个依赖已经卖到50个下载币,黑心啊,我找了很久终于找到了. 1.按固定长宽进行缩放 2.按固定文件大 ...

  7. ImageView可直接调用的,根据URL设置图片的工具类

    ImageView 是Android编程中最常用的组件之一. 但是根据图片的URL设置图片却很麻烦.因为获取网络图片的操作必须在异步线程中进行,根据URL设置ImageView图片就可能需要进行线程间 ...

  8. java 图片合成 工具类_Java实现的微信图片处理工具类【裁剪,合并,等比例缩放等】...

    本文实例讲述了Java实现的微信图片处理工具类.分享给大家供大家参考,具体如下: 现在 外面核心,图片文章比较少,看了拷贝代码,而用不了,用相应jar包处理,很多等比例缩放,达不到 想要的给予的期望: ...

  9. validate方法中校验工具类

    日常Java开发中,我们使用validate的校验是很方便的,但是也有一些特殊情况需要单独处理, 例如:导入Excel校验,传入的是MultipartFile文件类型,我们不能使用注解进行校验实体信息 ...

  10. java 图片image工具类,ImageUtil.java

    1.java 图片image工具类,ImageUtil.java package com.broadway.numpeople.utils;import java.awt.Color; import ...

最新文章

  1. 使用Eclipse更新软件时出现Unable to locate secure storage module错误的解决方法
  2. javascript 窗口加载事件相关问题
  3. Promise、Promise.all和Promise.race实现
  4. Spring Boot Transaction 源码解析(一)
  5. JavaScript--数据结构与算法之二叉树
  6. 所有受限制的应用程序包_您需要了解的有关Mac的Apple新款M1芯片的所有信息
  7. 快速批量一个半小时插入1亿条数据到mysql
  8. (八)mybatis之映射器
  9. 浮点数 字符串 java_Java如何将浮点数转换为字符串
  10. 云计算更适合小公司的八条原因
  11. 交换机路由器常用命令
  12. unity 走马灯packageManager
  13. 检验检测系统管理服务器,检验检测管理平台
  14. 斑马标签打印机蛋疼的打印错误处理方法
  15. mysql crud,mysql的CRUD操作实现
  16. ps图片拖不进去_win10中ps图片不能拖进去怎么办-修复ps无法直接拖入的教程 - 河东软件园...
  17. c语言hypot函数,hypot ( )【C语言库函数源代码】
  18. Apache服务器访问过慢分析及解决
  19. 黑马程序员java学习打卡----程序流程控制
  20. 解密NFT区块链游戏和收藏品市场

热门文章

  1. 【Builder设计模式】
  2. 3D建模大佬如何制作出惊艳四方的游戏建模,看完这篇文章我知道了
  3. 怎么测试abstract class
  4. MySQL的explain简书_mysql _ explain用法
  5. Python自动化开发基础 项目实战-监控系统 Day16-李杰-专题视频课程
  6. AWR系列之一——AWR简介
  7. Java学习(1) JDK安装及环境配制
  8. mac活动监视器里很多java_Mac活动监视器在哪 Mac活动监视器怎么用?
  9. 2个小投资不起眼的冷门小生意
  10. 用超级粘土做一个计算机,超级粘土模拟器