ImageIo.read 返回null

一、问题描述

今天收到一个bug就是imageio读取图片会返回null,具体如下

但是其他的图片就没有问题

二、问题分析

结合百度发现这张图片原本的后缀并非是jpg,使用notpard++打开就可以发现

好家伙是webp格式的!!!!

WebP是google开发的一种旨在加快图片加载速度的图片格式。图片压缩体积大约只有JPEG的2/3,并能节省大量的服务器带宽资源和数据空间。是现代图像格式,提供了优越的无损和有损压缩的图片在网络上。使用WebP,网站管理员和web开发人员可以创建更小、更丰富的图像,使网页更快。

WebP无损的png图像小26%。WebP有损图像是25 - 34%小于等效SSIM质量指数可比JPEG图像

无损WebP支持透明(也称为alpha通道)的成本只有22%额外的字节。对有损压缩RGB压缩情况下是可以接受的,有损WebP还支持透明度,通常提供3×PNG相比较小的文件大小。

但是!!!由于Webp格式推出比较晚, Jdk 内置的图片编解码库对此并不支持。我只需要知道如何把webp格式转换成jpg或者其他格式就可以了!!!

三、解决问题

1、在百度找到一个api(地址如下)

我是地址
友情建议,最好用0.1.0哪个版本的其他版本试了都有问题~~~~~~

2、由于这个项目并未发布到maven中央仓库,所以需要手动导入本地jar包.

(1)、maven导包
<dependency> 
  <groupId>com.github.nintha</groupId> 
  <artifactId>webp-imageio-core</artifactId> 
  <version>{versoin}</version> 
  <scope>system</scope> 
  <systemPath>${project.basedir}/libs/webp-imageio-core-{version}.jar</systemPath> 
</dependency>
(2)、gradle导包
dependencies {
  compile fileTree(dir:'src/main/resources/libs',include:['*.jar'])
}

当然了,你想放在自己仓库中也是无可厚非的

3、上代码

(1)、Webp编码
public static void main(String args[]) throws IOException {
  String inputPngPath = "test_pic/test.png";
  String inputJpgPath = "test_pic/test.jpg";
  String outputWebpPath = "test_pic/test_.webp";

  // Obtain an image to encode from somewhere
  BufferedImage image = ImageIO.read(new File(inputJpgPath));

  // Obtain a WebP ImageWriter instance
  ImageWriter writer = ImageIO.getImageWritersByMIMEType("image/webp").next();

  // Configure encoding parameters
  WebPWriteParam writeParam = new WebPWriteParam(writer.getLocale());
  writeParam.setCompressionMode(WebPWriteParam.MODE_DEFAULT);

  // Configure the output on the ImageWriter
  writer.setOutput(new FileImageOutputStream(new File(outputWebpPath)));

  // Encode
  writer.write(null, new IIOImage(image, null, null), writeParam);
}
(2)、Webp解码
public static void main(String args[]) throws IOException {
  ImageReader reader = ImageIO.getImageReadersByMIMEType("image/webp").next();

  WebPReadParam readParam = new WebPReadParam();
  readParam.setBypassFiltering(true);

  // Configure the input on the ImageReader
  reader.setInput(new FileImageInputStream(new File(webp图片地址)));

  // Decode the image
  BufferedImage image = reader.read(0, readParam);

  ImageIO.write(image, "jpg", new File(输出jpg的地址,png什么的也可以));
}

搞完收工!

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
可以通过使用反射机制来动态加载图片,从而实现跨平台调用。 首先,在项目中创建一个名为“images”的文件夹,将所有图片文件放在其中。然后,使用反射机制来加载这些图片,代码如下: ``` try { ClassLoader classLoader = getClass().getClassLoader(); I = ImageIO.read(classLoader.getResourceAsStream("images/I.png")); J = ImageIO.read(classLoader.getResourceAsStream("images/J.png")); L = ImageIO.read(classLoader.getResourceAsStream("images/L.png")); O = ImageIO.read(classLoader.getResourceAsStream("images/O.png")); S = ImageIO.read(classLoader.getResourceAsStream("images/S.png")); T = ImageIO.read(classLoader.getResourceAsStream("images/T.png")); Z = ImageIO.read(classLoader.getResourceAsStream("images/Z.png")); backImage = ImageIO.read(classLoader.getResourceAsStream("images/background.png")); } catch (IOException e) { e.printStackTrace(); } ``` 这样,在不同的平台上,只需要将图片文件放在“images”文件夹中,程序就可以自动加载它们,而不需要手动修改代码。 同时,还可以通过添加缓存机制来提高程序的性能,代码如下: ``` private static Map<String, Image> imageCache = new HashMap<>(); public static Image getImage(String path) { if (imageCache.containsKey(path)) { return imageCache.get(path); } else { try { ClassLoader classLoader = getClass().getClassLoader(); Image image = ImageIO.read(classLoader.getResourceAsStream(path)); imageCache.put(path, image); return image; } catch (IOException e) { e.printStackTrace(); return null; } } } ``` 这样,在加载图片时,可以先从缓存中查找,如果存在就直接返回,否则再加载并添加到缓存中,从而提高程序的性能。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值