Thumbnails使用方法(图片处理工具类)

我们在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;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497034.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浙江将建设超级高速公路,全面支持自动驾驶

来源&#xff1a;科技日报作者&#xff1a;江耘将建设的超级高速公路将具备智能、快速、绿色、安全的四大要素。浙江省要建设全国首条超级高速公路的说法于近日得到了官方证实。记者了解到&#xff0c;将建设的超级高速公路是已经分段批复的杭甬复线高速公路——杭绍甬高速公路…

Java消息服务~自动分配的消息头

消息头的值由JMS提供者来设置&#xff0c;开发者setJMSXxx()分配的值忽略。 JMSDestination 消息头使用一个Topic 或 Queue 对象来标识目的地。 Topic destination (Topic) message.getJMSDestination(); JMSDeliveryMode 在JMS 中&#xff0c;传送模式有两种类型&#xff1…

员工辞职的十大原因!

美国企管顾问史密斯&#xff08;Gregory Smith&#xff09;&#xff0c;日前在《CEO Refresher》杂志上指出&#xff0c;根据他多年的顾问经验&#xff0c;员工辞职的十大原因为&#xff1a; 1、员工的工作量过重&#xff0c;造成他们必须在晚上或周末加班。 2、公司…

1115 Counting Nodes in a BST(甲级)

1115 Counting Nodes in a BST (30分) A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes with keys less than or equal to the node’s key. The right subtree of …

Codeforces Round 917 (Div. 2)(A~D)(又是数学题)

A - Least Product 题意&#xff1a; 思路&#xff1a;若有奇数个负数&#xff0c;则不需要任何操作。若存在0&#xff0c;也不需要任何操作。其余情况将任意一个数改为0即可。 #include <bits/stdc.h> using namespace std; void solve() {int n;cin >> n;int …

权威发布:新一代人工智能发展白皮书(2017)

来源&#xff1a;机器人大讲堂指导单位、专家顾问及编写人员顾 问潘云鹤 中国工程院院士指导单位工业和信息化部信息化和软件服务业司指导委员会谢少锋 工信部信软司司长李冠宇 工信部信软司副司长徐晓兰 中国电子学会副理事长兼秘书长张宏图 中国电子学会总部…

Python 的 Gevent --- 高性能的 Python 并发框架

From&#xff1a;http://www.xuebuyuan.com/1604603.html Gevent 指南(英文)&#xff1a;http://sdiehl.github.io/gevent-tutorial Gevent 指南(中文)&#xff1a;http://xlambda.com/gevent-tutorial Gevent 指南(中文)下载地址&#xff1a;http://download.csdn.net/downloa…

AJAX Control Toolkit 控件学习(转自csdn山巅)

AJAX Control Toolkit 控件学习 2006-1-16 ToggleButton 关联ASP.NET CheckBox控件 RoundedCorder 造就圆角框 PasswordStrength TextBox中输入数据长度&#xff0c;以及限制&#xff1b;非常智能&#xff0c;有提示图 DropShadow 造就了照片的背影效果。 ScrollManag…

高通首次推出AI引擎 打包所有软硬件算力

来源&#xff1a;智东西作者&#xff1a;明天2月22日消息&#xff0c;高通宣布推出人工智能引擎&#xff08;AI Engine&#xff09;&#xff0c;让人工智能在终端侧&#xff08;如智能手机&#xff09;上的应用更快速、高效。该AI Engine包括软硬件两部分&#xff0c;在高通骁龙…

Java消息服务~开发者分配的消息头

生产者传送该消息之前在Message 对象上设置 JMSReplyTo 有些情况下&#xff0c;一个JMS消息生产者可能会要求消费者对一条消息做出应答。JMSReplyTo 消息头包含了一个javax.jms.Destination&#xff0c;标明了JMS 消费者应该应答的地址。请注意&#xff1a;如果某条消息头属性…

基金小窍门:如何判断基金的赚与赔

基金申购的时候&#xff0c;除了货币型基金&#xff0c;都有申购费,一般为申购金额的1.5%。 赎回的时候有赎回的手续费&#xff0c;一般为赎回金额的0.5%; 你只要记住两个单位净值就可以了&#xff1a;申购当日的基金单位净值&#xff08;记做x&#xff09;&#xff0c…

python Lambda 表达式

来源:http://www.cnblogs.com/jydeng/p/4145188.html 一、lambda函数 1、lambda函数基础&#xff1a; lambda函数也叫匿名函数&#xff0c;即&#xff0c;函数没有具体的名称,而用def创建的方法是有名称的。如下&#xff1a; """命名的foo函数"""…

一文详解「群体机器人」中的「实体进化」到底是什么?

原文来源&#xff1a;frontiers作者&#xff1a;Nicolas Bredeche、Evert Haasdijk、Abraham Prieto「雷克世界」编译&#xff1a;嗯~阿童木呀、KABUDA本文概述了适用于机器人群体&#xff08;robot collectives&#xff09;在线分布式进化的进化机器人技术&#xff0c;即实体进…

Java消息服务~JMSReplyTo示例

在下面的例子中&#xff0c;首先创建两个Queue&#xff0c;发送者给一个Queue发送&#xff0c;接收者接收到消息之后给另一个Queue回复一个Message&#xff0c;然后再创建一个消费者来接受所回复的消息 import javax.jms.Connection; import javax.jms.JMSException; impo…

prototype.js1.5平面结果导读图

转载于:https://www.cnblogs.com/zjypp/archive/2007/10/16/2319458.html

NumPy的详细教程

来源&#xff1a;http://blog.csdn.net/lsjseu/article/details/20359201 用 Python 做科学计算(PDF源码)&#xff1a;https://download.csdn.net/download/freeking101/10959832用 Python 做科学计算&#xff1a;基础篇、手册篇、实战篇&#xff1a;http://old.sebug.net/pap…

美媒评2018年全球十大突破性技术:AI和人工胚胎上榜

来源&#xff1a;新浪科技作者&#xff1a;邱越 斯眉美国《麻省理工科技评论》本周刊文&#xff0c;列出了2018年的10大科技突破。今年入选的技术包括人工智能技术“生成对抗网络”&#xff08;GAN&#xff09;、人工胚胎&#xff0c;以及基于天然气的清洁能源技术等。以下为完…

Java消息服务~消息属性

应用程序特定的属性 应用程序属性在消息传送之前进行设置。一旦一条消息发布或发送后&#xff0c;它就变成了只读&#xff08;read-only&#xff09;属性&#xff1b;消费或生产者都无法修改它的属性。不过可以调用clearProperties()后&#xff0c;修改属性。 TextMessage mes…

Sublime Text 全程图文指引

From&#xff08;Sublime Text 全程指南&#xff09;&#xff1a;http://zh.lucida.me/blog/sublime-text-complete-guide From&#xff08;Sublime Text 3 全程详细图文原创教程&#xff09;&#xff1a;http://www.qdfuns.com/notes/15088/7f1b1a378c5b85c179571e0860f2baad.…

设计模式分析

聚合&#xff0c;层次设计模式&#xff1a;适用于层次关系例子&#xff1a;publicclassFee { privatefloatvaluee 0; publicstringGetName() { //返回费用的名称} publicboolHasChildren() { //该费用类型是否有子类型} …