Java获取图片的大小、宽度、高度 & ImageIo.read 返回null

今日份鸡汤:我深知自己不够优秀,当遇到像太阳一样的人,我追赶不上,但是可以学着他们奔跑的样子,也往前走上几步,哪怕最后失去踪影,起码也曾被阳光沐浴过,往后,就照着光的样子生活~

需求场景:
前几天做了一个上传图片的接口,今天说让加一下尺寸和大小的限制,废话不多说,直接上代码吧:
我们前端是通过MultipartFile对象(该对象里面是图片)进行文件上传的。

public class Test {
    public static void main(String[] args) throws Exception {
        // 文件对象
        MultipartFile file = 假设此处是前端传过来的对象;
        // 文件大小;其中file.length()获取的是字节,除以1024可以得到以kb为单位的文件大小
        long size = file.getSize() / 1024;
        // 图片对象
        BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
        // 宽度
        int width = bufferedImage.getWidth();
        // 高度
        int height = bufferedImage.getHeight();
        // 打印信息
        System.out.printf("图片大小:%skb;图片宽度:%s像素;图片高度:%s像素", size, width, height);

执行结果:

图片大小:4424kb;图片宽度:7360像素;图片高度:4912像素

如果使用File对象(该对象里面是图片),代码如下:

public class Test {
    public static void main(String[] args) throws Exception {
        // 文件对象
        File file = new File("C:\\test\\20220619\\city.jpg");
        // 文件大小;其中file.length()获取的是字节,除以1024可以得到以kb为单位的文件大小
        long size = file.length() / 1024;
        // 图片对象
        BufferedImage bufferedImage = ImageIO.read(new FileInputStream(file));
        // 宽度
        int width = bufferedImage.getWidth();
        // 高度
        int height = bufferedImage.getHeight();
        // 打印信息
        System.out.printf("图片大小:%skb;图片宽度:%s像素;图片高度:%s像素", size, width, height);

执行结果:

图片大小:4424kb;图片宽度:7360像素;图片高度:4912像素

这块附上一个,postman测试文件上传的方法:https://www.jianshu.com/p/fe60e766d54a

虽然功能实现了,但是也不免遇到坑,我在本地测试的时候完全没有问题,但是部署到测试环境,其他同事就来反馈,图片不能上传,额。。。。

然后我就想着要不换个图片,果然换个图片空指针就出来了。debug发现bufferedImage = null。

简单描述就是有的图片格式正确,有的图片格式为WEBP,WEBP格式的就会出现null情况。

这块再简单说明一下ImageIO用法:
它可读取的图片类型是有限制的,可以读取图片的格式为:[BMP, bmp, jpg, JPG, wbmp, jpeg, png, PNG, JPEG, WBMP, GIF, gif]
但是你可能要说你的图片文件后缀是png格式,按道理说应该支持啊,后来将文件下载下来放到notepad++上查看才发现前缀是:RIFF?� WEBPVP8 这说明该文件的实际格式是webp格式。文件后缀名有时候不是实际的文件格式。

这段代码输出支持的图片处理格式

        String readFormats[] = ImageIO.getReaderFormatNames();
        String writeFormats[] = ImageIO.getWriterFormatNames();
        System.out.println("Readers: " + Arrays.asList(readFormats));