一、介绍

1、thumbnailator:https://github.com/coobird/thumbnailator
thumbnailator是图片处理的工具类,提供了很多图片处理的便捷的方法,这样我们就不要用jdk底层的ImageIO类了

thumbnailator的功能有按比例缩放,固定尺寸缩放,按尺寸等比缩放,旋转,加水印,压缩图片质量。thumbnailator固定尺寸缩放有可能会造成图片变型,有的时候我们可能需要固定尺寸并等比缩放,不够的地方补上空白。它没有提供直接的功能。下面是自己写的代码

public static void reduceImg(String srcImageFile, String destImageFile, int width, int height, boolean isScale) throws IOException {InputStream inputStream = new FileInputStream(srcImageFile);OutputStream outputStream = new FileOutputStream(destImageFile);BufferedImage bufferedImage = ImageIO.read(inputStream);int sWidth = bufferedImage.getWidth();int sHeight = bufferedImage.getHeight();int diffWidth = 0;int diffHeight = 0;if (isScale) {if ((double) sWidth / width > (double) sHeight / height) {int height2 = width * sHeight / sWidth;diffHeight = (height - height2) / 2;} else if ((double) sWidth / width < (double) sHeight / height) {int width2 = height * sWidth / sHeight;diffWidth = (width - width2) / 2;}}BufferedImage nbufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);nbufferedImage.getGraphics().fillRect(0, 0, width, height);//填充整个屏幕 nbufferedImage.getGraphics().drawImage(bufferedImage, diffWidth, diffHeight, width - diffWidth * 2, height - diffHeight * 2, null); // 绘制缩小后的图 ImageIO.write(nbufferedImage, FileUtils.getExtensionName(srcImageFile), outputStream);outputStream.close();inputStream.close();
}

2、TwelveMonkeys:https://github.com/haraldk/TwelveMonkeys
TwelveMonkeys的使用比较简单,只要把相关的jar包加入到类路径,他的类我们基本不会用到,只要使用jdk ImageIO或其上层的接口就行了。jdk的ImageIO有自动发现功能,会自动查找相关的编解码类并使用,而不使用jdk默认的编解码类,所以使用这个库是完全无入侵的

TwelveMonkeys是一个图片编解码库,支持bmp,jpeg,tiff,pnm,psd等。jdk本身也支持一些图片的处理,如jpeg,bmp,png,但是jdk的图片编解码库不是很强。

为什么需要TwelveMonkeys?我在处理jpeg图片的时候,发现用jdk自带的jpeg解析器不能解析所有的jpeg格式文件(如cmyk)。出现unsupported formate 错误,用这个库后,没有出现错误。

二、示例

1.创建缩略图

Thumbnails.of(new File("original.jpg")).size(160, 160).toFile(new File("thumbnail.jpg"));

在这个例子中,original.jpg的图像被调整大小,然后保存为thumbnail.jpg.

或者Thumbnailator将接受文件名作为字符串。不需要使用文件对象来指定图像文件:

Thumbnails.of("original.jpg").size(160, 160) .toFile("thumbnail.jpg");

2.创建带有旋转和水印的缩略图

Thumbnails.of(new File("original.jpg")).size(160, 160).rotate(90).watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File("watermark.png")), 0.5f).outputQuality(0.8).toFile(new File("image-with-watermark.jpg"));

在这个例子中,original.jpg图像被调整大小,然后顺时针旋转90度,然后水印放在右下角,其中一半是透明的,80%压缩质量设置,然后保存到image-with-watermark.jpg。

3.创建缩略图并写入输出流

OutputStream os = ...;Thumbnails.of("large-picture.jpg").size(200, 200).outputFormat("png").toOutputStream(os);

在这个例子中,图像large-picture.jpg图像最大尺寸被调整为200×200(保持原始图像的高宽比),并以PNG格式输出。

4.创建固定大小缩略图

BufferedImage originalImage = ImageIO.read(new File("original.png"));BufferedImage thumbnail = Thumbnails.of(originalImage).size(200, 200).asBufferedImage();

上面的代码获取原始图像,创建200x200像素缩略图,并将结果存储在缩略图中。

4.按给定因子缩放图像

BufferedImage originalImage = ImageIO.read(new File("original.png"));BufferedImage thumbnail = Thumbnails.of(originalImage).scale(0.25).asBufferedImage();

上面的代码在原始图像中获取图像并创建缩略图,该缩略图是原始图像的25%,并使用默认缩放技术以使缩略图存储在缩略图中。

5.创建缩略图时旋转图像

BufferedImage originalImage = ImageIO.read(new File("original.jpg"));BufferedImage thumbnail = Thumbnails.of(originalImage).size(200, 200).rotate(90).asBufferedImage();

上面的代码获取原始图像,并创建一个缩略图,顺时针旋转90度。

6.创建带水印的缩略图

BufferedImage originalImage = ImageIO.read(new File("original.jpg"));
BufferedImage watermarkImage = ImageIO.read(new File("watermark.png"));BufferedImage thumbnail = Thumbnails.of(originalImage).size(200, 200).watermark(Positions.BOTTOM_RIGHT, watermarkImage, 0.5f) .asBufferedImage();

水印的透明度可以通过改变最后的参数来调整,0.0F是完全透明的,1.0F是完全不透明的。
水印的位置可以通过选择Positions枚举类来设置。

7.将缩略图写入特定目录

File destinationDir = new File("path/to/output");Thumbnails.of("apple.jpg", "banana.jpg", "cherry.jpg").size(200, 200).toFiles(destinationDir,Rename.PREFIX_DOT_THUMBNAIL);

此示例将获取源图像,以新名称命名,生成200x200的缩略图并放在指定的destinationDir目录中。
缩略图最终存放为:

  • path/to/output/thumbnail.apple.jpg
  • path/to/output/thumbnail.banana.jpg
  • path/to/output/thumbnail.cherry.jpg

缩略图的新名称依据Rename枚举类的选择而改变。

图片处理之thumbnailator和TwelveMonkeys的使用相关推荐

  1. 图片处理(thumbnailator)

    1. maven <dependency><groupId>net.coobird</groupId><artifactId>thumbnailator ...

  2. 文件下载加水印工具类(pdf、word、excel、图片)

    文件加水印实现 支持文件类型 /*** 目前可支持加水印的文件类型*/private static List<String> FILE_TYPE_WATER_LIST = Arrays.a ...

  3. java给图片、word、ppt、excel、pdf添加水印

    java给图片.word.ppt.excel.pdf添加水印 使用poi.itextpdf.imageio等技术 只支持高版本的office,即支持docx.pptx.xlsx 给word添加水印遇到 ...

  4. 使用javax.imageio.ImageIO读取JPEG图片时出现异常java.awt.color.CMMException: General CMM error517

    目录 问题描述 背景 异常 解决 重现 紧急处理 解决方法 第一种:变更JDK版本 第二种:去掉引入的twelvemonkeys图片读取插件 问题描述 背景 由于业务需要,生产环境需要将用户上传的图片 ...

  5. java下载附件给(pdf、pptx、word、excel、图片)添加水印

    java下载附件给(pdf.pptx.word.excel.图片)添加水印 使用组件 poi itext spire.xls ooxml-schemas twelvemonkeys.imageio 等 ...

  6. java ofd文件转换图片

    是根据开源项目写的: https://gitee.com/ofdrw/ofdrw?_from=gitee_search 该ofdrw工具可以转换pdf.图片等,本文章主要介绍ofd文件使用ofdrw转 ...

  7. 尺寸有点太大了吧,我已经受不鸟了

    点击▲关注 "爪哇笔记"   给公众号标星置顶 更多精彩 第一时间直达 爪哇妹上线以来,已累计访问用户2w+,日访问1k+,随之而来的是流量暴增,本来阿里云还有十几块钱余额,结果这 ...

  8. 解决ImageIo图像类型不支持的异常:Unsupported Image Type

    在做图片压缩时,遇到如下错误: javax.imageio.IIOException: Unsupported Image Type 原因是jdk自带的jpeg解析器不能解析所有jpeg格式的图片,如 ...

  9. Java 代码基于开源组件生成带头像的二维码

    二维码在我们目前的生活工作中,随处可见,日常开发中难免会遇到需要生成二维码的场景,网上也有很多开源的平台可以使用,不过这里我们可以通过几个开源组件,自己来实现一下. 在动手之前我们先思考一下需要进行的 ...

  10. Java 代码基于开源组件生成带头像的二维码,推荐收藏

    二维码在我们目前的生活工作中,随处可见,日常开发中难免会遇到需要生成二维码的场景,网上也有很多开源的平台可以使用,不过这里我们可以通过几个开源组件,自己来实现一下. 在动手之前我们先思考一下需要进行的 ...

最新文章

  1. 在互联网圈混,怎么能不知道这9个Java方向公众号
  2. linux双系统 删一个,双系统删除linux
  3. 千万级规模高性能、高并发的网络架构经验分享--转
  4. 【转】用nohup命令让Linux下程序永远在后台执行
  5. 浏览器是如何工作的?(转载)
  6. 07-MyBatis 核心配置文件
  7. android多点触摸手势,安卓手势学习笔记(三) 多点触控
  8. php基本语法 格式,PHP 基本语法格式
  9. SSAS的MDX中的计算成员和命名集
  10. 一元三次方程重根判别式_一元四次方程的常规解法
  11. Angular 响应式表单 patchValue和setValue
  12. dart语言中的常量与变量
  13. Confluence 6 LDAP 用户结构设置
  14. HTML5+CSS期末大作业:个人网站设计——响应式个人简历介绍网页(5页) HTML+CSS+JavaScript
  15. Jenkins下载插件,报java.net.SocketTimeoutException: Read timed out
  16. Windows设置固定IP
  17. 圣诞Party将至!来来来,露一手用Python 抽奖
  18. 阿里财报中的饿了么:守正出奇
  19. 【RDMA】LRH和GRH InfiniBand标头(LRH and GRH InfiniBand Headers)
  20. GaussDB高斯数据库(SQL语法分类)

热门文章

  1. 编译Android版本的chromium浏览器
  2. js做一个碎片化轮播图酷炫特效【含免费源码获取】
  3. Echarts饼状图空心圆技巧 | 爱骇客 | 骇客
  4. 一个amp;quot;现象级amp;quot;大数据公司的蜕变
  5. 万凯新材深交所上市破发:募资超30亿 公司市值101亿
  6. OSChina 周日乱弹 —— 这二叉树长得,标致!
  7. 1. 如何创建python环境
  8. [源码阅读]解析Anime(JS动画库)核心(2)
  9. [蓝桥杯]打水问题、夺宝奇兵、调手表(c++详解)
  10. 概念区分:灰度发布、蓝绿发布、滚动发布