网站首页 > 教程分享 正文
哈喽,大家好啊,我是强哥。
不知道大家现在工作中还有没有使用过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 的效果。
不知道大家看到上面的代码后,会不会觉得云里雾里,而且代码非常冗长,不够人性化。怪不得用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);
看看类似的效果:
不错吧,真的做到了一行代码生成图片缩略图。
而且我们无需访问 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
写在最后
有兴趣的小伙伴可以下载下来用用。不过也很感谢那篇文章:字符作画,我用字符画个冰墩墩
真的,有时候做一个东西,有思路和有灵感比我们使用的工具更重要。
猜你喜欢
- 2024-10-27 用H5中的Canvas等技术制作海报(h5海报制作教程)
- 2024-10-27 QPainter类中文参考文档-成员函数
- 2024-10-27 uni-app 如何判断点击事件真的点到了图片内容上
- 2024-10-27 QPainter类中文参考文档-成员函数第二讲
- 2024-10-27 给图片加水印?这是我见过最简单的实现方式
- 2024-10-27 微信安卓内测版 8.0.23 开发者内容公布
- 2024-10-27 前端图像处理指南(前端绘图技术canvas)
- 2024-10-27 canvas实现下雪背景图(canvas 背景图)
- 2024-10-27 向2016年说“再见”(向2020年说再见作文)
- 2024-10-27 java 如何实现图片自动合成(java合成图片并添加文字)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- css导航条 (66)
- sqlinsert (63)
- js提交表单 (60)
- param (62)
- parentelement (65)
- jquery分享 (62)
- check约束 (64)
- curl_init (68)
- sql if语句 (69)
- import (66)
- chmod文件夹 (71)
- clearinterval (71)
- pythonrange (62)
- 数组长度 (61)
- javafx (59)
- 全局消息钩子 (64)
- sort排序 (62)
- jdbc (69)
- php网页源码 (59)
- assert h (69)
- httpclientjar (60)
- postgresql conf (59)
- winform开发 (59)
- mysql数字类型 (71)
- drawimage (61)
本文暂时没有评论,来添加一个吧(●'◡'●)