Thumbnailator 是一个优秀的图片处理的 Google 开源 Java 类库。处理效果远比 Java API 的好。但是在使用一个如此容易上手的工具库的过程中,也会踩中意向不到的坑。以下分享耗我半天时间才跳出来的坑。

我的设备是 MacBook Pro,能出现这种情况可能也跟我所使用的设备有关。

首先我要找个图片作为测试用途,那我用哪里的图片呢?我选择了当时最为顺手的从 Macbook 的备忘录里边拷贝一张图片以作使用,将该图片粘贴在一文件夹中。当我粘贴到文件夹中的时候是这样的

我尝试将后缀改成普通图片格式.jpg

 

发现图片依然神奇得能正常显示并且正常打开。好了,这时候也没有过多的考虑,接下来就来编写 java 代码。

以下是我代码片段,参照其他博主的帖子,Thumbnailator 的使用只需要以下简单的代码:

	public static void main(String[] args) {
		String path = "/图片存放路径/pic.jpg"; //定义图片输出路径
		String opath = "/图片存放路径/pic_cp.jpg"; //定于图片输出路径
		try {  //要求使用错误捕捉机制
            //将path的图片等比例缩放到最大宽900或高900,输出到opath
			Thumbnails.of(path).size(900, 900).toFile(opath); 
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

但是运行之后出现了报错,No suitable ImageReader found for /图片存放路径/pic.jpg.

2021-**-** 09:19:29,627 [main] ERROR util.ThumbnailsUtil.main(ThumbnailsUtil.java:14)  - thumbnailImage.error
net.coobird.thumbnailator.tasks.UnsupportedFormatException: No suitable ImageReader found for /图片存放路径/pic.jpg.
	at net.coobird.thumbnailator.tasks.io.FileImageSource.read(Unknown Source)
	at net.coobird.thumbnailator.tasks.SourceSinkThumbnailTask.read(Unknown Source)
	at net.coobird.thumbnailator.Thumbnailator.createThumbnail(Unknown Source)
	at net.coobird.thumbnailator.Thumbnails$Builder.toFile(Unknown Source)
	at com.trendy.ow.console.article.util.ThumbnailsUtil.main(ThumbnailsUtil.java:14)

翻译过来中文就是“找不到适用于的图片阅读器”,也就是说 Thumbnailator 找到了这个文件,但是并不能读取到图片。此时,回想到在学习编写该代码的过程中,也看见过其他博主的文章中有使用 InputStream 输入流输入到 Thumbnailator 中,会不会是我的输入方式的问题呢?好吧我再试试:

	public static void main(String[] args) {
		String path = "/图片存放路径/pic.jpg"; //定义图片输出路径
		String opath = "/图片存放路径/pic_cp.jpg"; //定于图片输出路径
		try {  //要求使用错误捕捉机制
            //使用文件输入流 FileInputStream 读取图片
			FileInputStream fileInputStream = new FileInputStream(path);
            //将fileInputStream的图片等比例缩放到最大宽900或高900,输出到opath
			Thumbnails.of(fileInputStream).size(900, 900).toFile(opath); 
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

此时,报错的内容稍微有所变动,变成了 No suitable ImageReader found for source data.

net.coobird.thumbnailator.tasks.UnsupportedFormatException: No suitable ImageReader found for source data.
	at net.coobird.thumbnailator.tasks.io.InputStreamImageSource.read(Unknown Source)
	at net.coobird.thumbnailator.tasks.SourceSinkThumbnailTask.read(Unknown Source)
	at net.coobird.thumbnailator.Thumbnailator.createThumbnail(Unknown Source)
	at net.coobird.thumbnailator.Thumbnails$Builder.toFile(Unknown Source)
	at com.trendy.ow.console.article.util.ThumbnailsUtil.main(ThumbnailsUtil.java:14)

然后就这个问题,翻完了当时为数不多关于这两个报错的技术博客,都还是找不到答案。再当我将一切东西重新开始,图片使用微信新发过来的其他图片,问题就解决了。

总结

该报错主要跟图片的格式有关。图片的格式并不单纯指的是文件的后缀,而是图片实际上的组织格式。Thumbnailator 能够正常处理 jpg、jpeg、png 等常用格式的图片。

在 MacBook 中,备忘录将图片的格式都转化为了 .tiff 格式,此时可能是一种经过备忘录转化过的图片格式,具体这种格式是什么可以自行跳转到 百度百科 看看。此时的 .tiff 强行改后缀变成 .jpg 后,Thumbnailator 里没有 .tiff 的阅读器,固出现这样的报错。

在之后的使用发现,没有必要使用输入流的格式输入图片,此时更容易产生 No suitable ImageReader found for source data 报错。在输入时直接指向图片路径即可。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐