您现在的位置是:首页 > 技术教程 正文

Java 转换 WebP 图片,使用 webp-imageio

admin 阅读: 2024-03-30
后台-插件-广告管理-内容页头部广告(手机)

WebP 是 Google 推出的一种新型图片格式,相比于传统的 PNG/JPG 图片有着更小体积的优势,在当今 Web 中有着广泛的应用。但是 Java 和 JDK 本身不支持 WebP 图像,不过我们可以使用 webp-imageio 库来支持 WebP 图片。

顺便提一提其他库支持的方式。WebP 最早是这个 webp project of Luciad 库提供支持的,但它需要手动安装对应的动态链接库,非常不方便。qwong/j-webp 项目作者为了解决这个问题,改进了对动态链接库的读取方式,把从java.library.path读取改成了从项目 resource 文件中读取。虽然 qwong/j-webp 项目解决了动态链接库依赖问题,但是它并未对这些代码提供一个良好封装,于是有了 webp-imageio-core 提供一个可用的 jar 包,只要导入项目即可使用。虽然如此,但 webp-imageio-core 并未提供一个开放的 Maven 依赖,稍微有些不便,——所以最终选择了 webp-imageio。

首先加入依赖。

<dependency> <groupId>org.sejda.imageiogroupId> <artifactId>webp-imageioartifactId> <version>0.1.6version> dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

读取 WebP 图片

像正常读取 Jpg/Png 那样,无须 import 其他包。

BufferedImage image = ImageIO.read(new File("/home/gc/my_image.webp")); System.out.printf("\nDimension of the image:%dx%d", image.getWidth(), image.getHeight());
  • 1
  • 2

无损压缩

接着我们试试转换 Jpg 到 WebP。首先使用无损格式保存图像,把WebPWriteParam#setCompressionType选项将压缩类型设置为LOSSLESS_COMPRESSION。

/** * 无损压缩 */ private static void convertJpegToWebpLossless() { try { BufferedImage image = ImageIO.read(new File("C:\\Users\\admin\\Desktop\\pbd00106jp-7.jpg")); ImageWriter writer = ImageIO.getImageWritersByMIMEType("image/webp").next(); WebPWriteParam writeParam = new WebPWriteParam(writer.getLocale()); writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); // 设置无损 writeParam.setCompressionType(writeParam.getCompressionTypes()[WebPWriteParam.LOSSLESS_COMPRESSION]); // 保存图片 writer.setOutput(new FileImageOutputStream(new File("C:\\Users\\admin\\Desktop\\sample.webp"))); writer.write(null, new IIOImage(image, null, null), writeParam); } catch (IOException e) { throw new RuntimeException(e); } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

笔者试了比原来 jpg 更大数倍!原先 100kb 左右的 jpg 变成 400kb!

有损压缩

以下代码将读取 Jpg 图像并以 80%压缩质量(0% 具有最高压缩,100% 具有最高质量)将其保存为 WebP。

private static void convertJpegToWebpWithLossyCompression() { try { BufferedImage image = ImageIO.read(new File("C:\\Users\\admin\\Desktop\\pbd00106jp-7.jpg")); ImageWriter writer = ImageIO.getImageWritersByMIMEType("image/webp").next(); WebPWriteParam writeParam = new WebPWriteParam(writer.getLocale()); writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); // 设置有损压缩 writeParam.setCompressionType(writeParam.getCompressionTypes()[WebPWriteParam.LOSSY_COMPRESSION]); //设置 80% 的质量. 设置范围 0-1 writeParam.setCompressionQuality(0.8f); // Save the image writer.setOutput(new FileImageOutputStream(new File("C:\\Users\\admin\\Desktop\\sample.webp"))); writer.write(null, new IIOImage(image, null, null), writeParam); } catch (IOException e) { throw new RuntimeException(e); } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

笔者测试,80% 的压缩比就非常理想,100kb Jpg 变成 44kb!

小结

借助 webp-imageio 库,我们可以轻松地读取和写入 WebP 图像。

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索