图片处理之thumbnailator和TwelveMonkeys的使用
一、介绍
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的使用相关推荐
- 图片处理(thumbnailator)
1. maven <dependency><groupId>net.coobird</groupId><artifactId>thumbnailator ...
- 文件下载加水印工具类(pdf、word、excel、图片)
文件加水印实现 支持文件类型 /*** 目前可支持加水印的文件类型*/private static List<String> FILE_TYPE_WATER_LIST = Arrays.a ...
- java给图片、word、ppt、excel、pdf添加水印
java给图片.word.ppt.excel.pdf添加水印 使用poi.itextpdf.imageio等技术 只支持高版本的office,即支持docx.pptx.xlsx 给word添加水印遇到 ...
- 使用javax.imageio.ImageIO读取JPEG图片时出现异常java.awt.color.CMMException: General CMM error517
目录 问题描述 背景 异常 解决 重现 紧急处理 解决方法 第一种:变更JDK版本 第二种:去掉引入的twelvemonkeys图片读取插件 问题描述 背景 由于业务需要,生产环境需要将用户上传的图片 ...
- java下载附件给(pdf、pptx、word、excel、图片)添加水印
java下载附件给(pdf.pptx.word.excel.图片)添加水印 使用组件 poi itext spire.xls ooxml-schemas twelvemonkeys.imageio 等 ...
- java ofd文件转换图片
是根据开源项目写的: https://gitee.com/ofdrw/ofdrw?_from=gitee_search 该ofdrw工具可以转换pdf.图片等,本文章主要介绍ofd文件使用ofdrw转 ...
- 尺寸有点太大了吧,我已经受不鸟了
点击▲关注 "爪哇笔记" 给公众号标星置顶 更多精彩 第一时间直达 爪哇妹上线以来,已累计访问用户2w+,日访问1k+,随之而来的是流量暴增,本来阿里云还有十几块钱余额,结果这 ...
- 解决ImageIo图像类型不支持的异常:Unsupported Image Type
在做图片压缩时,遇到如下错误: javax.imageio.IIOException: Unsupported Image Type 原因是jdk自带的jpeg解析器不能解析所有jpeg格式的图片,如 ...
- Java 代码基于开源组件生成带头像的二维码
二维码在我们目前的生活工作中,随处可见,日常开发中难免会遇到需要生成二维码的场景,网上也有很多开源的平台可以使用,不过这里我们可以通过几个开源组件,自己来实现一下. 在动手之前我们先思考一下需要进行的 ...
- Java 代码基于开源组件生成带头像的二维码,推荐收藏
二维码在我们目前的生活工作中,随处可见,日常开发中难免会遇到需要生成二维码的场景,网上也有很多开源的平台可以使用,不过这里我们可以通过几个开源组件,自己来实现一下. 在动手之前我们先思考一下需要进行的 ...
最新文章
- 在互联网圈混,怎么能不知道这9个Java方向公众号
- linux双系统 删一个,双系统删除linux
- 千万级规模高性能、高并发的网络架构经验分享--转
- 【转】用nohup命令让Linux下程序永远在后台执行
- 浏览器是如何工作的?(转载)
- 07-MyBatis 核心配置文件
- android多点触摸手势,安卓手势学习笔记(三) 多点触控
- php基本语法 格式,PHP 基本语法格式
- SSAS的MDX中的计算成员和命名集
- 一元三次方程重根判别式_一元四次方程的常规解法
- Angular 响应式表单 patchValue和setValue
- dart语言中的常量与变量
- Confluence 6 LDAP 用户结构设置
- HTML5+CSS期末大作业:个人网站设计——响应式个人简历介绍网页(5页) HTML+CSS+JavaScript
- Jenkins下载插件,报java.net.SocketTimeoutException: Read timed out
- Windows设置固定IP
- 圣诞Party将至!来来来,露一手用Python 抽奖
- 阿里财报中的饿了么:守正出奇
- 【RDMA】LRH和GRH InfiniBand标头(LRH and GRH InfiniBand Headers)
- GaussDB高斯数据库(SQL语法分类)
热门文章
- 编译Android版本的chromium浏览器
- js做一个碎片化轮播图酷炫特效【含免费源码获取】
- Echarts饼状图空心圆技巧 | 爱骇客 | 骇客
- 一个amp;quot;现象级amp;quot;大数据公司的蜕变
- 万凯新材深交所上市破发:募资超30亿 公司市值101亿
- OSChina 周日乱弹 —— 这二叉树长得,标致!
- 1. 如何创建python环境
- [源码阅读]解析Anime(JS动画库)核心(2)
- [蓝桥杯]打水问题、夺宝奇兵、调手表(c++详解)
- 概念区分:灰度发布、蓝绿发布、滚动发布