一行代码搞定图片缩略图处理

简介: 不知道大家现在工作中还有没有使用过Java处理图片的。强哥在大学毕业后,从事服务端WEB开发,就很少接触图片处理。有接触图片的,大多也就是图片的上传下载。所以,对Java处理图片相关的技术也都没怎么接触。

哈喽,大家好啊,我是强哥。


不知道大家现在工作中还有没有使用过Java处理图片的。强哥在大学毕业后,从事服务端WEB开发,就很少接触图片处理。有接触图片的,大多也就是图片的上传下载。所以,对Java处理图片相关的技术也都没怎么接触。


不过,前几天看到一篇文章,讲述怎么用字符画一个冰墩墩,倒是被文章中使用的技术所吸引。而其中就用到了Java的原生的图片处理类:java.awt.Graphics2D和Image.getScaledInstance进行获取图片缩略图的操作。这里先简单地介绍下:


java.awt.Graphics2D 调整图片大小。


Graphics2D 是 Java 平台提供的可以渲染二维形状、文本、图像的基础类,下面是使用 Graphics2D 进行图片大小调整的简单示例。


/**
 * 图片缩放
 *
 * @param srcImagePath  图片路径
 * @param targetWidth   目标宽度
 * @return
 * @throws IOException
 */
public static BufferedImage resizeImage(String srcImagePath, int targetWidth) throws IOException {
    Image srcImage = ImageIO.read(new File(srcImagePath));
    int targetHeight = getTargetHeight(targetWidth, srcImage);
    BufferedImage resizedImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB);
    Graphics2D graphics2D = resizedImage.createGraphics();
    graphics2D.drawImage(srcImage, 0, 0, targetWidth, targetHeight, null);
    graphics2D.dispose();
    return resizedImage;
}
/**
 * 根据指定宽度,计算等比例高度
 *
 * @param targetWidth   目标宽度
 * @param srcImage      图片信息
 * @return
 */
private static int getTargetHeight(int targetWidth, Image srcImage) {
    int targetHeight = srcImage.getHeight(null);
    if (targetWidth < srcImage.getWidth(null)) {
        targetHeight = Math.round((float)targetHeight / ((float)srcImage.getWidth(null) / (float)targetWidth));
    }
    return targetHeight;
}


调整大小后的图片可以通过以下方式保存。


BufferedImage image = resizeImage("/Users/darcy/Downloads/bingdundun.jpeg", 200);
File file = new File("/Users/darcy/Downloads/bingdundun_resize.jpg");
ImageIO.write(image, "jpg", file);


使用 Image.getScaledInstance 调整图片大小。


这是 Java 原生功能调整图片大小的另一种方式,使用这种方式调整图片大小简单方便,生成的图片质量也不错,代码比较简洁,但是这种方式的效率并不高。


/**
 * 图片缩放
 *
 * @param srcImagePath  图片路径
 * @param targetWidth   目标宽度
 * @return
 * @throws IOException
 */
public static BufferedImage resizeImage2(String srcImagePath, int targetWidth) throws IOException {
    Image srcImage = ImageIO.read(new File(srcImagePath));
    int targetHeight = getTargetHeight(targetWidth, srcImage);
    Image image = srcImage.getScaledInstance(targetWidth, targetHeight, Image.SCALE_DEFAULT);
    BufferedImage bufferedImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB);
    bufferedImage.getGraphics().drawImage(image, 0, 0, null);
    return bufferedImage;
}
// getTargetHeight 同 java.awt.Graphics2D 中示例代码


下面把原图为 416 x 500 的冰墩墩图片缩放到 200 x 240 的效果。


48.png


不知道大家看到上面的代码后,会不会觉得云里雾里,而且代码非常冗长,不够人性化。怪不得用Java处理图片的人很少。


那么有没有其他优雅、简练且易用的方式处理图片缩略图呢?


怎么使用一行代码处理图片


秉承开源至上的原则,经过强哥的一番搜索。嘿嘿,还真给我找到了。就是它:Thumbnailator,一个专门处理缩略图的Java库。


Thumbnailator可用于在一个简单的步骤中执行相当复杂的缩略图处理任务。


例如,在目录中创建图像文件的 JPEG 缩略图,在保留原始图像的纵横比的同时,全部调整为 640 像素 x 480 像素的最大尺寸,可以通过以下方式执行:


Thumbnails.of(new File("path/to/directory").listFiles())
    .size(640, 480)
    .outputFormat("jpg")
    .toFiles(Rename.PREFIX_DOT_THUMBNAIL);


看看类似的效果:


49.png


不错吧,真的做到了一行代码生成图片缩略图。


而且我们无需访问 Image I/O API 并通过对象手动操作BufferedImages 。Thumbnailator为我们完成所有这些工作,我们只需导入Thumbnailator的Jar包加上上面代码就行。Maven工程的用户更是可以使用如下方式添加依赖:


<dependency>
        <groupId>net.coobird</groupId>
        <artifactId>thumbnailator</artifactId>
        <version>[0.4, 0.5)</version>
</dependency>


来吧,献上GitHub上的开源地址:https://github.com/coobird/thumbnailator


写在最后


有兴趣的小伙伴可以下载下来用用。不过也很感谢那篇文章:字符作画,我用字符画个冰墩墩


真的,有时候做一个东西,有思路和有灵感比我们使用的工具更重要。

相关文章
|
SQL 关系型数据库 MySQL
18 PDO你知道是什么吗?
路老师在知乎分享了PHP语言的知识,重点介绍了PDO(PHP Data Object)数据库抽象层。PDO旨在解决PHP早期版本的维护难题,提高代码的可移植性和兼容性。文章详细讲解了PDO的基本概念、特点、连接数据库的方法以及执行SQL语句的几种方式,包括`exec()`、`query()`、`prepare()`和`execute()`方法。适合PHP初学者深入了解和实践。
1048 3
|
前端开发 Java
Java Process类Runtime.getRuntime().exec() 执行bat脚本程序
Java Process类Runtime.getRuntime().exec() 执行bat脚本程序
943 0
|
3月前
|
存储 传感器 人工智能
RFID货架物品管理迈入智能化
RFID技术赋能货架管理,实现非接触、批量、实时识别,提升盘点效率与准确率,支持智能入库、动态库存、防错拣货、全程追溯,推动零售仓储迈向自动化、智能化,降本增效。
|
4月前
|
存储 数据采集 算法
RFID究竟是如何实现快速盘点?
RFID技术通过非接触式批量识别,大幅提升盘点效率。它利用射频信号自动读取多个标签信息,无需人工逐个操作,广泛应用于仓库、零售、资产等领域的高效数据采集。
|
4月前
|
安全 Java 数据库
SpringSecurity认证授权及项目集成
本文介绍了基于Spring Security的权限管理框架,涵盖认证、授权与鉴权核心概念,通过快速入门示例演示集成流程,并结合数据库实现用户认证。进一步扩展实现正常登录,JWT登录及鉴权管理器,实现灵活的安全控制,适用于前后端分离项目中的权限设计与实践。
452 4
|
API 开发者
WebSocket API 中的 onerror 事件和 close 事件有什么不同?
【10月更文挑战第26天】`onerror`事件侧重于通知开发者WebSocket连接过程中出现的错误,以便进行相应的错误处理和恢复;而`close`事件则主要用于在连接关闭时进行资源清理和根据关闭情况采取适当的后续操作。两者在WebSocket应用的开发中都起着重要的作用,帮助开发者更好地管理和处理WebSocket连接的各种情况。
|
7月前
|
人工智能 测试技术 API
企业级特性对比:Apipost vs Apifox 哪个能更好地满足大型企业需求?
在数字化转型中,大型企业对API管理工具要求严苛。本文对比Apipost与Apifox的企业级特性,涵盖功能完整性、团队协作、数据管理及性能稳定性等方面。Apipost凭借丰富设计选项、AI自动化测试、高效协作支持和精细权限管理等优势,在应对大规模数据与高并发场景时表现更优,是更适合大型企业的选择。
123 1
|
SQL 关系型数据库 数据库
PostgreSQL常用命令,启动连接,pg_dump导入导出
PostgreSQL常用命令,启动连接,pg_dump导入导出
在Linux中,如何把系统中不用服务关掉?
在Linux中,如何把系统中不用服务关掉?
Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified
Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified
422 0