背景
公司项目需要做一个图片预览的功能,并且要展示图片的分辨率(即宽和高),目前的框架没有这个功能,所以得自己写一个方法去读取上传的附件。百度了一下,发现用Java包中的ImageIO就可以得到图片的宽和高。但是,有部分图片会读出null,然后空指针异常。主要代码如下:
1 | File file = new File(filePath); |
解决过程
造成这个问题的原因是图片的后缀可能是jpg、png,但是图片实际上是另一种格式(比如webp、tif)。先打印一下ImageIO支持的文件格式,代码如下:
1 | // JDK8输出:JPG jpg bmp BMP gif GIF WBMP png PNG wbmp jpeg JPEG |
可以看出ImageIO不支持读取webp格式,JDK8之前不支持读取tif格式图片。
如果图片源格式是tif,那么在项目中加入下面的依赖就行:
1 | <dependency> |
ImageIO 会自动搜索类路径下继承的接口和子类不用改代码。
最终解决
我的图片源格式是webp的,网上找了下资料,大部分都是用的第一种方法。
方法一
-
在项目中添加依赖
1
2
3
4
5
6
7<dependency>
<groupId>com.github.nintha</groupId>
<artifactId>webp-imageio-core</artifactId>
<version>0.1.1</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/libs/webp-imageio-core-0.1.1.jar</systemPath>
</dependency>
我做了两步后一直报下面的错误:
1 | Caused by: java.lang.UnsatisfiedLinkError: com.luciad.imageio.webp.WebPDecoderOptions.createDecoderOptions()J |
试了把webp-imageio-core-0.1.1.jar包中的dll文件放到jdk/jre/lib目录也没解决,于是放弃这种方法。
方法二(最终解决)
- 写个工具类获取文件的mimeType,代码如下:
1 | public class ImgeMimeTypeUtil { |
- 在业务代码中对webp格式单独处理
1 | String fileType = ImgeMimeTypeUtil.getMimeType(filePath); |
至此,终于解决,完美!
附(快速查看webp格式)
直接把图片用记事本打开,如果第一行有显示"WEBPVP8"之类的文字就是webp格式的图片。
如图所示,文件名虽然是jpg后缀但是内容却是webp。