PNG、JPG Auto Convert WebP【Gradle自定义Task】

187 阅读3分钟

如果您正好在处理图片资源压缩,并且使用了 Android Studio 自带的 Google 转换工具 Convert to WebP,可能已经受够了单张图片转换的耗时批量转换时的不确定性。在这种情况下,不妨试试我的这个插件!

image.png

image.png

1.功能介绍

image.png

2.效果展示

image.png 上述结果展示了对项目中 drawable-xxhdpi 文件夹内大于 50KBPNGJPG 资源文件进行无损压缩后的效果:

  • 成功转换&删除 24个资源文件
  • 节省 4.9MB 大小

3.PNG、JPG、Webp介绍

  1. PNG (Portable Network Graphics)

    无损压缩:PNG 是一种无损压缩格式,适合需要高保真图像的场景,如图标和 UI 元素。
    支持透明度:PNG 支持透明通道(Alpha 通道),适用于需要透明背景的图像。
    • 文件较大:由于是无损压缩,PNG 文件通常比 JPG 文件大。
    • 适用场景:多用于图标、矢量图、Logo 等需要保持图像质量和透明度的场景。

  2. JPG (Joint Photographic Experts Group)

    • 有损压缩:JPG 使用有损压缩技术,会在压缩过程中丢失一些图像细节,但文件大小较小。
    • 不支持透明度:JPG 不支持透明背景,因此不适合 UI 元素或需要透明度的图像。
    • 适用场景:适合存储照片等复杂场景的图像,特别是背景图片或其他色彩丰富的图像,能有效减少文件大小。

  3. WEBP (Web Picture)

    高效压缩:WEBP 支持有损和无损压缩,可以在较小的文件大小下保持较高的图像质量。
    支持透明度:WEBP 支持透明通道,兼具 PNG 和 JPG 的优点。
    • 加载性能:在 Android 上,WEBP 的加载性能优于 PNG 和 JPG,特别是对于大图片资源。
    • 适用场景:广泛适用于多种场景,特别是高效、优质图像需求的应用。适合用于需要减少应用体积的项目中。

4.Webp

image.png 参考:developer.android.com/studio/writ…

4.1.无损压缩

Android Studio 自带的转换工具支持无损压缩,使用如下:

image.png 例如转换一个375kb的图片:

image.png

转换后 180kb,无损压缩大概节省了 195kb

image.png

4.2.有损压缩

image.png 同一张375kb的图片,有损质量0.75压缩后,7.6kb!

image.png

5.流程&使用&源码:

image.png

5.1. 添加 webp-imageio依赖

`imageio`是一个用于处理 WebP 图片格式的 Java 库。它基于 ImageIO 扩展了 Java 的标准图像处理功能,能够支持 WebP 图片的读取和写入操作。WebP 是一种具有较高压缩效率的图片格式,因此在需要优化存储空间或传输效率的场景中(如应用中加载大量图片)常常使用。

5.2 将源码拷贝到项目中,源码如下

在根目录注册Task build.gradle.kts

tasks.register<com.doctorbox_buildsrc.ConvertImageToWebpTask>("convertPngToWebp") {

    quality = 0.35f // 设置转换质量

    // 可选:自定义输入输出目录

    sourceDir = rootProject.project("app").file("src/main/res")

    outputDir = rootProject.project("app").file("src/main/res")

    minSizeKB = 20  // 只转换大于 50KB 的图片

    shouldDeleteOriginal = true // 是否删除原 png 文件

    // 有损、无损压缩(默认无损)

    compressionMode = com.doctorbox_buildsrc.CompressionMode.LOSSY

    // 使用通配符的模式匹配

//    whitelistPatterns = setOf(

//        "bg_ai_*.png"

//    )

//

//    // 白名单配置(完整文件名匹配)

//    whitelistFiles = setOf(

//        "bg_big_group.png"

//    )

}

image.png

5.3. 使用:在Terminal中执行 ./gradlew convertPngToWebp

image.png

6. Q&A

6.1 是否支持白名单

已支持,具体配置见👆🏻

-   具体的文件名
-   通配符

6.2 为什么使用有损压缩质量设置0.35、0.75差别不大?

WebP 转换工具已经对图像进行了优化进行质量减少,平衡了压缩率和图像质量。即使设定较低的质量值,图像算法可能会尽量减少丢失关键细节,以便不显著影响视觉效果。

6.3 TinyPng 2次压缩问题

经手动测试,TinyPng 压缩后的图片,再转webp,如果无损压缩的情况下目前看没有问题。

源码:github.com/paihuai00/D… 有问题请联系:307292568@qq.com