在处理图片资源时,经常需要对图片进行缩放或生成缩略图,这里介绍2种方式实现:
1)im4java
im4java是ImageMagick的SDK,ImageMagick是一款专业的图片处理工具,可以进行各种图像处理,例如获取图片信息、图像缩放、图像旋转等等
使用时需要先在本地安装工具包,工具包官网地址:https://imagemagick.org/index.php
注意:安装时请安装7.1及以上的版本,否则亲测会有严重的性能问题,我这里安装的ImageMagick-7.1.0-Q16-HDRI
im4java官方文档地址:https://im4java.sourceforge.net/docs/dev-guide.html
先引入依赖:
<dependency>
<groupId>org.im4java</groupId>
<artifactId>im4java</artifactId>
<version>1.4.0</version>
</dependency>
使用im4java生成缩略图示例代码如下:
import org.im4java.core.ConvertCmd;
import org.im4java.core.IM4JavaException;
import org.im4java.core.IMOperation;
import org.im4java.core.ImageCommand;
import java.io.IOException;
public class Im4JavaUtils {
/**
* 缩放图片,加锁的原因是避免起多个子进程,CPU占用高,导致系统崩溃
*
* @param imageMagickPath 工具路径
* @param srcImagePath 原图片地址
* @param newImagePath 新图片地址
* @param width 缩放后的宽度
* @param height 缩放后的高度
*/
public static synchronized void zoomImage(String imageMagickPath, String srcImagePath, String newImagePath, Integer width, Integer height)
throws IOException, InterruptedException, IM4JavaException {
ImageCommand cmd = new ConvertCmd();
cmd.setSearchPath(imageMagickPath);
IMOperation operation = new IMOperation();
operation.addImage(srcImagePath + "[0]");
if (width != null && height != null) {
operation.resize(width, height);
}
operation.addImage(newImagePath);
cmd.run(operation);
}
}
注意:
- operation.addImage(srcImagePath + "[0]")原图片地址后加上[0]可以处理动态图片,例如GIF,也可以处理视频文件的第一帧图片,普通图片格式加上也不影响处理结果
- 使用时请对并发度进行控制,否则同时拉起多个子进程进行图像操作,可能会使系统CPU飙高,导致崩溃
2)Thumbnailator
Thumbnailator是一款优秀的图片处理工具包,使用非常简单,几行代码即可完成图片的处理
官方文档地址:GitHub - coobird/thumbnailator: Thumbnailator - a thumbnail generation library for Java
先引入依赖:
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.20</version>
</dependency>
使用Thumbnailator生成缩略图示例代码如下:
import net.coobird.thumbnailator.Thumbnails;
import java.io.IOException;
public class ThumbnailatorUtils {
/**
* 指定图片大小进行缩放
*
* @param srcImagePath 原始图片路径
* @param newImagePath 缩放后的图片路径
* @param width 缩放后的宽度
* @param height 缩放后的高度
* @param quality 图片质量,0-1,越高质量越好
*/
public static void zoomImageBySize(String srcImagePath, String newImagePath, int width, int height, float quality) throws IOException {
Thumbnails.of(srcImagePath).size(width, height).outputQuality(1f).toFile(newImagePath);
}
/**
* 指定缩放比率进行缩放
*
* @param srcImagePath 原始图片路径
* @param newImagePath 缩放后的图片路径
* @param scaleRatio 缩放比率
* @param quality 图片质量,0-1,越高质量越好
*/
public static void zoomImageByScale(String srcImagePath, String newImagePath, double scaleRatio, float quality) throws IOException {
Thumbnails.of(srcImagePath).scale(scaleRatio).outputQuality(1f).toFile(newImagePath);
}
}
可以指定图片大小或者指定缩放比率进行缩放,还有些其他参数具体可参考官网文档