目录

    • 1. 引入pom依赖
    • 2. 配置常量枚举
    • 3. Thumbnailator常用方法解析介绍
      • 3.1 size(int var1, int var2):指定大小进行缩放
      • 3.2 scale(double var1, double var3):按照比列进行缩放或扩大
      • 3.3 rotate(double var1):旋转
      • 3.4 watermark(Position var1, BufferedImage var2, float var3):添加水印
      • 3.5 sourceRegion(Position var1, int var2, int var3):剪裁
      • 3.6 outputFormat(String var1):转化图像格式
      • 3.7 反参:BufferedImage
  • javax.imageio.IIOException: Unsupported Image Type 异常解决:
  • 链接:[Thumbnailator图片处理的常用方法解析介绍 源代码下载地址](https://download.csdn.net/download/JAVA_MHH/21442635)

1. 引入pom依赖

  • 谷歌压缩工具Thumbnailator, 支持 图片缩放,区域裁剪,水印,旋转等
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.2.RELEASE</version></parent><dependencies><!--两个用来做测试的jar包--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency><!--主要的图片处理对象--><dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.14</version></dependency></dependencies>

2. 配置常量枚举

  • 这里主要是为了规范,测试的话写个常量就行

public enum ImgSizes {/*** 小图100*100*/_100_100{@Overridepublic int height(){return 100;}/*** 图片宽度*/@Overridepublic int width() {return 100;}/*** 名称*/@Overridepublic String sizeName(){return "100_100小图";}},_200_300{@Overridepublic int height(){return 300;}/*** 图片宽度*/@Overridepublic int width() {return 200;}/*** 名称*/@Overridepublic String sizeName(){return "200_300规格图";}},/*** 大图400*400*/_400_400{@Overridepublic int height(){return 400;}/*** 图片宽度*/@Overridepublic int width() {return 400;}/*** 名称*/@Overridepublic String sizeName(){return "400_400大图";}};/*** 图片长度*/public abstract int height();/*** 图片宽度*/public abstract int  width();/*** 图片别名* @return*/public abstract String sizeName();
}

3. Thumbnailator常用方法解析介绍

原图:

原图参数:

3.1 size(int var1, int var2):指定大小进行缩放

  • size(width,height) 若图片横比入参小,高比入参小,图片大小不变
  • toOutputStream(OutputStream var1): 直接获取字节流等参数
  • keepAspectRatio(boolean var1): 是否强制指定大小进行缩放 (默认为false)

import com.it.mhh.enums.ImgSizes;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import org.junit.Test;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;public class thumbnailatorTest {/**todo():*      反参:toOutputStream(OutputStream var1): 直接获取字节流等参数*      反参:toFile(File var1 || String var1): 直接写出比例图片*      参数:keepAspectRatio(boolean var1):   是否强制指定大小进行缩放 (),false表示强制指定大小进行缩放** size(width,height) 若图片横比200小,高比300小,不变* 若图片横比200小,高比300大,高缩小到300,图片比例不变 若图片横比200大,高比300小,横缩小到200,图片比例不变* 若图片横比200大,高比300大,图片按比例缩小,横为200或高为300*/@Testpublic void toOutputStreamTest() throws IOException {ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//        Thumbnails.of("D:\\doc\\FF.jpg").size(ImgSizes._100_100.length(),ImgSizes._100_100.width()).toFile("D:\\doc\\100.jpg");Thumbnails.of("D:\\doc\\FF.jpg").size(ImgSizes._200_300.height(), ImgSizes._200_300.width()).keepAspectRatio(false).toOutputStream(outputStream);ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("D:\\doc\\new.jpg"));int len;byte[] bytes = new byte[128];while ((len = inputStream.read(bytes)) != -1) {bufferedOutputStream.write(bytes, 0, len);}bufferedOutputStream.close();inputStream.close();}}

结果:

  • 可以看到 因为设置了keepAspectRatio(boolean var1)并制定了false 所以按强制性自己规定的像素,其实这里不建议强制性 会造成图片像素看着不协调,扭曲;

3.2 scale(double var1, double var3):按照比列进行缩放或扩大

  • 缩放还是扩大改变的都是像素
  • scale(double var1 || double var1, double var3):传一个参表示按此比例进行缩放或者扩大;两个参则表示(宽度,高度)缩放或扩大 >1为扩大 <1为缩放
import com.it.mhh.enums.ImgSizes;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import org.junit.Test;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;public class thumbnailatorTest {/*** todo() 改变的是像素* scale(double var1   ||  double var1, double var3):传一个参表示按此比例进行缩放或者扩大;两个参则表示(宽度,高度)缩放或扩大   >1为扩大  <1为缩放* <p>* 按照比例进行缩放** @throws IOException*/@Testpublic void scaleTest() throws IOException {BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(new File("D:\\doc\\FF.jpg")));//Thumbnails.of(bufferedInputStream).scale(2).toFile("D:\\doc\\scale.jpg");//宽度,高度Thumbnails.of(bufferedInputStream).scale(1, 2).toFile("D:\\doc\\scale.jpg");}}

结果:

  • 可以看出我只是在 高度上填了2 所以只是高度是扩大 2倍

3.3 rotate(double var1):旋转

  • rotate(角度): 正数:顺时针 负数:逆时针
  • URL:(file:) 表示获取本地文件
import com.it.mhh.enums.ImgSizes;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import org.junit.Test;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;public class thumbnailatorTest {/**   todo()*       旋转:*       rotate(角度);*                   正数:顺时针 负数:逆时针*   URL:(file:\) 表示获取本地文件** */@Testpublic void rotateTest() throws IOException {//URL:(file:\) 表示获取本地文件URL url = new URL("file:\\D:\\doc\\FF.jpg");// rotate(角度),正数:顺时针 负数:逆时针Thumbnails.of(url).scale(1).rotate(180).toFile("D:\\doc\\rotate.jpg");}}

结果:

  • 填的是正数…这里是顺时针旋转得出的结果 虽然旋转了180°看不出来…

3.4 watermark(Position var1, BufferedImage var2, float var3):添加水印

水印:

  • watermark(水印位置,要添加的水印图,透明度)
  • 水印透明度取值范围[0f-1f]
  • outputQuality(图片质量) 取值范围[0f-1f]
import com.it.mhh.enums.ImgSizes;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import org.junit.Test;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;public class thumbnailatorTest {/*** TODO()* watermark(水印位置,要添加的水印图,透明度)* 水印透明度取值范围[0f-1f]* outputQuality(图片质量)* 取值范围[0f-1f]*/@Testpublic void watermarkTest() throws IOException {// watermark(水印位置,要添加的水印图,透明度)Thumbnails.of("D:\\doc\\FF.jpg").scale(1).watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("D:\\doc\\aa.png")), 0.5f).outputQuality(1f).useOriginalFormat().toFile("D:\\doc\\watermark.jpg");}}

结果:

  • 可指定水印添加在哪个位置以及水印的透明度[取值范围(0F-1F)]

3.5 sourceRegion(Position var1, int var2, int var3):剪裁

  • java中Positions定位枚举 不多说 就是上中下 左右 等…
  • 主要说下 自定义剪裁 :sourceRegion(int var1, int var2, int var3, int var4) va1确定其宽度 va2确定其高度 va1和va2确定一个点 va3为宽度 va4为高度 va1+va3为第二个点的宽度 va2+va4为顶二个点的高度 两个点确定剪裁范围
import com.it.mhh.enums.ImgSizes;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import org.junit.Test;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;public class thumbnailatorTest {/*** TODO()* 裁剪* 自定义裁剪范围:* //sourceRegion(int var1, int var2, int var3, int var4) va1确定其宽度 va2确定其高度 va1和va2确定一个点  va3为宽度 va4为高度  va1+va3为第二个点的宽度 va2+va4为顶二个点的高度    两个点确定剪裁范围** @throws IOException*/@Testpublic void sourceRegionTest() throws IOException {/*** 图片中心400*400的区域*/Thumbnails.of("D:\\doc\\FF.jpg").scale(1).sourceRegion(Positions.CENTER, ImgSizes._400_400.height(), ImgSizes._400_400.width()).toFile("D:\\doc\\centerSourceRegion.jpg");/*** 图片右下400*400的区域*/Thumbnails.of("D:\\doc\\FF.jpg").scale(1).sourceRegion(Positions.BOTTOM_RIGHT, ImgSizes._400_400.height(), ImgSizes._400_400.width()).toFile("D:\\doc\\bottomRightSourceRegion.jpg");/*** 指定坐标*///sourceRegion(int var1, int var2, int var3, int var4) va1确定其宽度 va2确定其高度 va1和va2确定一个点  va3为宽度 va4为高度  va1+va3为第二个点的宽度 va2+va4为顶二个点的高度    两个点确定剪裁范围Thumbnails.of("D:\\doc\\FF.jpg").scale(1).sourceRegion(50, 0, 700, 550).toFile("D:\\doc\\sourceRegion.jpg");}}

自定义剪裁结果:

  • 自定义剪裁 用4个值确定两个点

3.6 outputFormat(String var1):转化图像格式

  • outputFormat(String var1): 其实这里也可以不用这个方法 只要指定后缀名就可以 什么样的后缀名就是什么格式
import com.it.mhh.enums.ImgSizes;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import org.junit.Test;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;public class thumbnailatorTest {/*** todo()* 转化图像格式* outputFormat(String var1):  其实这里也可以不用这个方法 只要指定后缀名就可以 什么样的后缀名就是什么格式** @throws IOException*/@Testpublic void outputFormatTest() throws IOException {/*** outputFormat(图像格式)*/Thumbnails.of("D:\\doc\\FF.jpg").scale(1).outputFormat("gif").toFile("D:\\doc\\outputFormat.gif");}}

结果:

  • 从jpg格式转换为 gif格式

3.7 反参:BufferedImage

  • 获取带缓冲区图像类
import com.it.mhh.enums.ImgSizes;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import org.junit.Test;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;public class thumbnailatorTest {/*** 输出到BufferedImage** @throws IOException*/@Testpublic void asBufferedImageTest() throws IOException {/*** asBufferedImage() 返回BufferedImage*/BufferedImage thumbnail = Thumbnails.of("D:\\doc\\FF.jpg").scale(1).asBufferedImage();ImageIO.write(thumbnail, "jpg", new File("D:\\doc\\imageIO.jpg"));}}

结果:

  • 通过获得BufferedImage对象 通过ImageIO对象写出

javax.imageio.IIOException: Unsupported Image Type 异常解决:

  • 引入下方依赖就可以了
  • 该工具类用于java代码ImageIO.read()的文件为jpg格式,且色彩模式为cmyk格式时抛异常Unsupported Image Type 可以导入该工具类,代码不需要加任何处理,再次运行即可。
     <dependency><groupId>com.twelvemonkeys.imageio</groupId><artifactId>imageio-jpeg</artifactId><version>3.4.1</version></dependency>

链接:Thumbnailator图片处理的常用方法解析介绍 源代码下载地址

Thumbnailator图片处理的常用方法解析介绍相关推荐

  1. python timer使用-Python timer定时器两种常用方法解析

    这篇文章主要介绍了Python timer定时器两种常用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 方法一,使用线程中现成的: 这种一般 ...

  2. pythonrequests解析_Python requests获取网页常用方法解析

    这篇文章主要介绍了Python requests获取网页常用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 主要记录使用 requests ...

  3. python生成器 图片分类_python批量处理图片图片Python迭代器和生成器介绍

    Python迭代器和生成器介绍迭代器 迭代器是一个实现了迭代器协议的对象,Python中的迭代器协议就是有next方法的对象会前进到下一结果,而在一系列结果的末尾是,则会引发StopIteration ...

  4. python定时器的使用方法_Python timer定时器两种常用方法解析

    这篇文章主要介绍了Python timer定时器两种常用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 方法一,使用线程中现成的: 这种一般 ...

  5. python requests.get无法取出网页_Python requests获取网页常用方法解析

    这篇文章主要介绍了Python requests获取网页常用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 主要记录使用 requests ...

  6. python加密模块教程_Python hashlib加密模块常用方法解析

    这篇文章主要介绍了Python hashlib加密模块常用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 主要用于对字符串的加密,最常用的为 ...

  7. python给pdf加图片签名_Python生成个性签名图片获取GUI过程解析

    这篇文章主要介绍了Python生成个性签名图片获取GUI过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 先来看看程序运行的样子: 所以,程序 ...

  8. Google图片新高科技之WebP介绍

    链接:Google图片新高科技之WebP介绍 前言 不管是 PC 还是移动端,图片一直是流量大头,以苹果公司 Retina 产品为代表的高 PPI 屏对图片的质量提出了更高的要求,如何保证在图片的精细 ...

  9. 图片基础与tf.keras介绍

    图片基础与tf.keras介绍 1.1 图像基本知识 回忆:之前在特征抽取中如何将文本处理成数值. 思考:如何将图片文件转换成机器学习算法能够处理的数据? 我们经常接触到的图片有两种,一种是黑白图片( ...

最新文章

  1. python哪本好-在众多小说中,Python告诉你哪本小说好看
  2. myeclise 安装
  3. LeetCode Algorithm 1925. 统计平方和三元组的数目
  4. php流程控制语句,php学习之道:php 流程控制语句
  5. 前端学习(703):white小练习
  6. 轻松搞定JSONP跨域请求
  7. smokeping主从同步报错
  8. el table怎么获取最后一行_element中el-table单行暂无数据和整体暂无数据的默认修改...
  9. 数字图像处理(三) 图像的变换
  10. React Native 生成 released apk图片不显示
  11. 阿里巴巴 EasyExcel (web版) 上传与下载(超详细) Excel上传下载
  12. 如何安装树莓派鱼眼摄像头模块
  13. jrebel IDEA热部署插件激活
  14. 【MySQL】轻松学习 唯一索引
  15. 【Love2d从青铜到王者】第三篇:Love2d变量以及函数
  16. outlook一直显示尝试连接服务器,OUTLOOK EXPRESS老是连接不上服务器怎么办?
  17. 微信网页授权多应用多域名使用 oauth2授权
  18. linux当中shadow文件的作用,解释Linux中passwd与shadow文件
  19. 深度解析:大数据面前,统计学的价值在哪里?
  20. 147. 对链表进行插入排序嗯嗯对的

热门文章

  1. 六级备考23天|CET-6|翻译技巧4|2013年官方样题|新年|9:45~11:00
  2. 玩转华为ENSP模拟器系列 | 配置LDP传输地址
  3. Java实现阴历日历表(附带星座)
  4. 利用ArcGIS和Excel PQ提取地块的图幅号
  5. 2022学校体育教育及设施展览会
  6. 计算机网络家庭中的交换机与路由器
  7. linux下没有sz和rz命令,sz/rz工具包
  8. ABB机器人搬运码垛/柴垛项目实战案例
  9. 学生党适合做什么兼职,学生党兼职项目推荐
  10. 测试电梯的测试用例_经典面试题:怎么测试一部电梯?