A-A+

Python-批量要是iOS项目中的图片,减小IPA包的大小

2020年05月11日 iOS原创文章 暂无评论
博客主机

我们知道针对ipa的瘦身,资源是占大头的!

TinyPNG

这里我使用的是 TinyPNG《https://tinypng.com》 TinyPNG也提供了Python的库,大家使用的时候注册账号申请Key就行了,需要说明的是TinyPNG免费一个月只能压缩500张,如果针对小的项目来说500张已经够了,要是公司的项目比较大,可以选择多注册几个账号😂,我是建议要是有能力还是购买一下,毕竟别人维护更新也不易,要是资金比较紧张或者公司是个铁公鸡就算了,就勉为其难的薅薅羊毛吧!😂

详细可以看TinyPNG的Python的API!

主要代码如下:

import tinify
tinify.key = "sDz081wW56kWgFncVqD1nm5vxykbJjgt"  # 你的秘钥
source = tinify.from_file("right_btn.jpg")        # 压缩前
source.to_file("right_btn.jpg")                   # 压缩后

源码

代码方面我准备了多个Key,然后记录压缩的日志,话不多说上代码,部分主要如下:

import tinify
import os
import sys
import ASHelp
import ASCutDownView
from ASPersoninfo import *

tinify_key_list = ['sDz081wW56kWgFncVqD1nm5vxykbJjgt', # 已经超过500
                   'dX8rL9C6bpsjcx0NjFdw6rSWTWg8JwbR', # 已经超过500
                   ]

# tinify.key = 'TTYlnmj9xX1vhvdpfDFZwMTxrsj13Kkt'
# 所有的图片路径
_all_png_path_list = []
# 已经压缩的
_already_compressed_list = []
# 项目总路径
_file_dir = None
# 单利
_personinfo = ASPersoninfo()

# 获取路径
def get_path(fileName):
    path = os.path.join(os.path.dirname(sys.argv[0]), fileName)
    return path

# 已经压缩的图片路径日志
_already_compressed_path = get_path('already_compressed.txt')

# 判断是不是图片
def is_image(tmp_path):
    imageType = imghdr.what(tmp_path)
    return imageType

# 读取所以的png图片
def read_all_png_image(file_dir):
    global _all_png_path_list, _personinfo
    fs = os.listdir(file_dir)
    for dir in fs:
        tmp_path = os.path.join(file_dir, dir)
        if not os.path.isdir(tmp_path):
            if is_ignore_path(tmp_path) == False and tmp_path.endswith('.png'):
                # 当前图片即不在需要压缩的图片中  又不在已经压缩过的图片里面
                if tmp_path not in _all_png_path_list and tmp_path not in _already_compressed_list:
                    _all_png_path_list.append(tmp_path)
        else:
            if _personinfo.is_stop == True:
                # 停止了
                pass
            else:
                read_all_png_image(tmp_path)

# 保存已经压缩的图片路径
def save_already_compressed_path_list_txt():
    global _already_compressed_list
    create_already_compressed_txt()

    file_data = ''

    # 保存 _already_compressed_list
    for item in _already_compressed_list:
        file_data += item + '
'

    ropen = open(_already_compressed_path, 'w', encoding='utf-8')
    ropen.write(file_data)
    ropen.close()

# 读取已经压缩的文件
def read_already_compressed_path_list_txt():
    create_already_compressed_txt()

    # 读取
    _history_text_list = []
    ropen = open(_already_compressed_path,'r')
    for line in ropen:
        line = line.replace('
', '')
        if line.endswith('.png'):
            _already_compressed_list.append(line)

            # 简化日志输出
            new_line_list = line.split('/')
            if len(new_line_list) >= 3:
                new_line_list = new_line_list[len(new_line_list) - 3:]
            new_line = '/'.join(new_line_list)
            new_line = '.../' + new_line
            _history_text_list.append(new_line)

    return '
'.join(_history_text_list)

# 创建already_compressed.txt
def create_already_compressed_txt():
    if os.path.exists(_already_compressed_path) == False:
        # 不存在
        Wopen = open(_already_compressed_path, 'w')
        Wopen.close()
    else:
        # 已存在
        pass

# 是不是忽略的路径
def is_ignore_path(tmp_path):
    # 先判断是不是忽略的图片
    global _personinfo
    if len(_personinfo.ignore_img_list) > 0:
        for image_name in _personinfo.ignore_img_list:
            if '/' + image_name + '.' in tmp_path:
                return True
            elif '/' + image_name + '@' in tmp_path:
                return True

    if '/.' in tmp_path:
        return True
    elif '/Pods' in tmp_path:
        return True
    elif '.bundle/' in tmp_path:
        return True
    else:
        return False

# 开始压缩图片
def start_compress_png_image(tmp_path):
    global _all_png_path_list
    if tmp_path not in _all_png_path_list:
        _all_png_path_list.append(tmp_path)

#这里就是通过tingPng压缩图片的核心代码
def compress_core(file, outputFile):
    # 已经使用过多少次
    compressions_this_month = str(tinify.compression_count)

    source = tinify.from_file(file)  #压缩指定文件
    source.to_file(outputFile)       #将压缩后的文件输出当指定位置

# 压缩所有的项目图片
def compress_all_png_image():
    global _all_png_path_list, _already_compressed_list, _personinfo
    for png_path in _all_png_path_list:
        if _personinfo.is_stop == True:
            # 停止了
            break
        # 当前图片没有压缩
        if png_path not in _already_compressed_list:
            try:
                source = tinify.from_file(png_path)
                source.to_file(png_path)
                # 压缩过了 添加到压缩图片中
                _already_compressed_list.append(png_path)
                # 日志
                ASHelp.info('压缩成功:' + png_path)
            except Exception as error:
                ASHelp.error('压缩失败:' + png_path + '【' + str(error) +'】')
                break
# 验证卡密的
def tinify_validate(key):
    try:
        tinify.key = key
        tinify.validate()
        return None
    except Exception as error:
        return str(error)

# 停止压缩了 0系统停止的 1手动停止的
def did_stop_compress():
    if _personinfo.is_stop == False:
        ASHelp.info('-' * 20 + '图片压缩结束' + '-' * 20)
    else:
        ASHelp.info('-' * 20 + '手动停止压缩' + '-' * 20)

    ASCutDownView.stop_tiny_image()

# 清空历史记录
def clean_history_txt():
    global _already_compressed_path
    create_already_compressed_txt()
    try:
        os.remove(_already_compressed_path)
        return None
    except Exception as error:
        return error

# 初始化
def init_data():
    global _all_png_path_list, _already_compressed_list, _file_dir, _personinfo
    _all_png_path_list = []
    _already_compressed_list = []
    _file_dir = None

    # 设置卡密
    tinify.key = _personinfo.tinify_key

    # 重新开始了
    _personinfo.is_stop = False

# 开始压缩项目的图片
def start_compress_pro_image(file_dir):
    global _file_dir, _personinfo
    init_data()
    if len(_personinfo.tinify_key) == 0:
        # 错误抛出
        ASHelp.error('-' * 20 + '没有设置卡密' + '-' * 20)
        return
    ASHelp.info('-' * 20 + '图片压缩开始' + '-' * 20)
    _file_dir = file_dir
    # 先读取已经压缩的图片
    read_already_compressed_path_list_txt()
    # 开始读取项目中的图片
    read_all_png_image(_file_dir)
    # 读取了所有的图片,开始压缩所有的图片
    compress_all_png_image()
    # 保存已经压缩的图片
    save_already_compressed_path_list_txt()
    # 压缩结束
    did_stop_compress()

if __name__ == '__main__':
    file_dir = '/Users/administrator/Desktop/ahaschool_ios/Ahaschool'
    start_compress_pro_image(file_dir)

结束语

在这里插入图片描述

因为有些iOS开发者并不会Python,我后来把脚本改为GUI的桌面程序了,小白简单易操作,界面如下:

标签:

给我留言

Copyright © ios教程,苹果粉丝,苹果资讯,ios入门教程,ios学习,ios程序员,ios视频教程,ios粉丝网 保留所有权利.   Theme  Ality

用户登录