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


    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 图像。

  • 相关阅读:
    单片机设计_RTC时钟(ACM32F403)
    LeetCode 45. Jump Game II(DP)
    2022牛客暑期多校训练营7(BCFGJ)
    GraphicsMagick之实践出真知
    Blazor前后端框架Known-V1.2.2
    第二章 第八节:列表的增删改查
    腾讯云双11服务器优惠活动价格表预热!
    springData JPA
    【Java】若依前后端分离,分页数据为null报错
    装饰模式 rust和java的实现
  • 原文地址:https://blog.csdn.net/zhangxin09/article/details/132912689