移动开发时批处理压缩图片提高开发效率

3,041 阅读3分钟

1. 为什么要压缩图片?

在UI给开发图片的时候,经常都是没有压缩过的原图,但是移动开发时要尽可能减小app体积,而图片在app体积中占比极大,所以将大图压缩为小容量图片并且尽可能不影响图片质量是减小app体积所必须的操作

2. 如何压缩?

压缩方法有很多,网上各种压缩工具,传统压缩方法是UI给了图用这些工具批量压缩,缺点就是要手动选择不同文件夹下的图片,不能做到自定义

3. 压缩为什么格式?

但是现在流行的是压缩为webp格式,WebP 的优势体现在它具有更优的图像数据压缩算法,能带来更小的图片体积,而且拥有肉眼识别无差异的图像质量;同时具备了无损和有损的压缩模式、Alpha 透明以及动画的特性,在 JPEG 和 PNG 上的转化效果都相当优秀、稳定和统一。

4. 用python自动化批处理压缩的脚本

直接放脚本代码 文件名compressImage.py

#!/usr/bin/python
# -*- coding:utf8 -*-

# author:liuhc
# description:压缩指定模块里的大图为webp格式
# create date:2020-09-24 on 1:20 PM
import os


# 查找指定文件夹里大于指定kb的图片列表
def findBigImageFile(folder, size):
    bigFiles = []
    for foldername, subfolders, filenames in os.walk(folder):
        # 对文件进行遍历
        for filename in filenames:
            # .getsize(path)必须是完整路径
            file = os.path.join(foldername, filename)
            # size*1024,使参数size单位为kb
            if os.path.getsize(file) > size * 1024:
                file = os.path.abspath(file)
                suffix = os.path.splitext(file)[1]
                if (suffix == ".png" or suffix == ".jpg") and file.find(".9.png") == -1:
                    bigFiles.append(file)
    return bigFiles


# 将modules中的文件夹都添加到集合里并返回
def saveBigImageFile(modules):
    folders = []
    for module in modules:
        folders.append(module)
    return folders


# modules为当前同级目录下的图片文件夹列表
modules = ["assets/images"]
folders = saveBigImageFile(modules)

# 将大于指定kb的文件都存到bigFiles里
bigFiles = []
for folder in folders:
    # 查找指定文件夹里大于指定kb的图片列表
    bigFiles += findBigImageFile(folder, 50)

# 压缩前的大小
beforeCompressSize = 0
# 压缩后的大小
afterCompressSize = 0
for bigFile in bigFiles:
    absFileName = os.path.splitext(bigFile)[0]
    before = os.path.getsize(bigFile) / 1024
    beforeCompressSize += before
    print("压缩前", before, "kb")
    cmd = "cwebp -q 75 " + bigFile + " -o " + absFileName + ".webp"
    print(cmd)
    os.system(cmd)
    after = os.path.getsize(absFileName + ".webp") / 1024
    afterCompressSize += after
    print("压缩后", after)
for bigFile in bigFiles:
    # 转为webp后删除原文件
    os.remove(bigFile)

if beforeCompressSize > 0:
    print("压缩比", afterCompressSize / beforeCompressSize * 100, "%")

其中代码里的modules = ["assets/images"]为我们要压缩的图片所在的文件夹,路径是相对python脚本文件所在位置的相对路径 然后打开Android Studio的Terminal框,输入python3 compressImage.py即可将我们的图片文件夹里大于指定kb的图片压缩为webp格式并删除被压缩的文件。

注意事项

上文中的webp命令需要自己安装对应文件。Google提供了命令行工具用于将图片转换为webp。在Mac下,可以使用homebrew安装webp工具:

brew install webp

总结

在上面的脚本里我的modules = ["assets/images"]写的是Flutter项目的图片所在路径,如果是Android项目或者IOS项目填写对应项目的图片所在路径即可。将脚本拷贝到自己的项目里,修改modules = ["assets/images"]后,以后UI给了开发图片,只需要放到对应文件夹然后运行一次该脚本即可。

demo已放到github,是Flutter项目: github.com/ikakaxi/com…