• 1
  • 2
分享
  • 【原创】如何使用 tinypng 进行批量压缩
  • sylan215 2019-01-21 16:04:03 字数 2841 阅读 3149 收藏 2

不管是博客还是产品中,都会涉及图片的使用,但是如果图片体检太大,会影响使用体验,所以网上有各种各样的支持图片压缩的网站,tinypng 是其中的佼佼者。

今天要介绍的就是如何通过 python 脚本实现一键压缩。

直接上代码:

# -*- coding: utf-8 -*-
"""脚本功能说明:使用 tinypng,一键批量压缩指定文件(夹)所有文件"""
import os
import sys
import tinify
tinify.key = "你自己申请的 key" # AppKey
def get_file_dir(file):
    """获取文件目录通用函数"""
    fullpath = os.path.abspath(os.path.realpath(file))
    return os.path.dirname(fullpath)
def check_suffix(file_path):
    """检查指定文件的后缀是否符合要求"""
    file_path_lower = file_path.lower()
    return (file_path_lower.endswith('.png')
            or file_path_lower.endswith('.jpg')
            or file_path_lower.endswith('.jpeg'))
def compress_by_tinypng(input_file):
    """使用 tinypng 进行压缩,中文前面的 u 是为了兼容 py2.7"""
    if not check_suffix(input_file):
        print(u'只支持png\\jpg\\jepg格式文件:' + input_file)
        return
    file_name = os.path.basename(input_file)
    output_path = os.path.join(get_file_dir(sys.argv[0]), 'tinypng')
    output_file = os.path.join(output_path, file_name)
    print(output_file)
    if not os.path.isdir(output_path):
        os.makedirs(output_path)
    try:
        source = tinify.from_file(input_file)
        source.to_file(output_file)
        print(u'文件压缩成功:' + input_file)
        old_size = os.path.getsize(input_file)
        print(u'压缩前文件大小:%d 字节' % old_size)
        new_size = os.path.getsize(output_file)
        print(u'文件保存地址:%s' % output_file)
        print(u'压缩后文件大小:%d 字节' % new_size)
        print(u'压缩比: %d%%' % ((old_size - new_size) * 100 / old_size))
    except tinify.errors.AccountError:
        print(u'Key 使用量已超,请更新 Key,并使用命令[Usage] %s [filepath] [key]运行'
              % os.path.basename(sys.argv[0]))
def check_path(input_path):
    """如果输入的是文件则直接压缩,如果是文件夹则先遍历"""
    if os.path.isfile(input_path):
        compress_by_tinypng(input_path)
    elif os.path.isdir(input_path):
        dirlist = os.walk(input_path)
        for root, dirs, files in dirlist:
            for filename in files:
                compress_by_tinypng(os.path.join(root, filename))
    else:
        print(u'目标文件(夹)不存在,请确认后重试。')
if __name__ == '__main__':
    len_param = len(sys.argv)
    if len_param != 2 and len_param != 3:
        print('[Usage] %s [filepath]' % os.path.basename(sys.argv[0]))
    elif len_param == 3:
        tinify.key = sys.argv[2]
        check_path(sys.argv[1])
    else:
        check_path(sys.argv[1])

使用说明

1. 请先安装 tinify 的依赖库:

python -m pip install tinify

2. 申请 tinify key

https://tinypng.com/developers 申请自己的 key,每个 key 每个月可以压缩 500 个文件。

3. 执行脚本

申请完 key 之后,更新到代码段中的:

tinify.key = "your key" # AppKey

然后带参数执行脚本即可。
带的第一个参数是必选的,可以是文件,也可以是文件夹。
第二个参数是可选的,自定义 key,如果输入了第三个参数,则优先使用自定义 key。
压缩后的文件,默认输出到当前脚本所在目录下的 tinypng 文件夹中,如果要输出到其他位置,可以自行修改脚本实现。
PS:已使用 Python2.7 和 Python3.4 亲测有效,其他 Python 版本如果有异常,请反馈。
更详细的说明请跳转到项目地址:https://github.com/sylan215/compress-with-tinypng,欢迎大家 star,并一起丰富这个脚本的功能。

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   当前测试市场技术发生了什么变化?  自2018年,软件测试就业市场发生了变化。因为随着国内互联网的发展,测试越来越重要,根据业务的不同,导致发展方向越来越多,细分职能越来越多,请看下图:  所以市场上对软测技能要求也是水涨船高,企业更需要的是全栈型测试,或懂得多种测试技能,以提高人效。早期功能测试打天下,撸起袖子就是点的时代早已一去不复返,如果你刚入行也许认为我还能点点点,那么你可能很快会被行业淘汰,从入门到失业你做到了无缝衔接。  未来路如果想走的更好,我们有必要深入了解下软件测试行业未来发展趋势,让我们一起来拥抱变化:  趋势1.功能测试虽然是测试的核心,但提供的价值日益降低。当前行业...
            0 0 1002
            分享
          • 读者提问:超好用的PC端录屏软件有推荐的吗 ?阿常回答:1、EV 录屏官网地址:https://www.ieway.cn2、傲软录屏官网地址:https://www.apowersoft.cn 3、芦笋官网地址:https://lusun.com4、迅捷录屏官网地址:https://xunjieshipin.com5、OBS官网地址:obsproject.com6、Windows 自带的录屏工具,Xbox7、Mac 自带的录屏工具,QuickTime Player阿常碎碎念:阿常平时喜欢用系统自带的录屏功能,大家可以根据个人偏好来选取合适的录屏软件。看完今天的分享对你是不是...
            0 0 934
            分享
          •   苹果公司今天推出了 iOS 17.2,为 iPhone 15 Pro 和 iPhone 15 Pro Max 用户提供了录制空间视频的功能。通过这项新功能,用户可以在即将推出的MR头显 Apple Vision Pro 上进行3D拍摄,体验他们最喜爱的回忆和特殊时刻。  苹果公司解释说,为了创建3D视频,iPhone 在录制时会同时使用主摄像头和广角摄像头。然后,这些视频会以单个文件的形式保存在照片应用中名为"空间"的新相册中。这些视频还将通过 iCloud 在不同设备间同步,空间视频的拍摄分辨率为 1080p,每秒 30 帧。  空间视频录制可在"设置&qu...
            0 0 528
            分享
          • 引言在软件测试中,一个项目的自动化测试包括UI自动化、API自动化、压力自动化等,把这些不同类型的自动化测试组装在一起变构成了一个项目的自动化测试。通过执行项目的自动化测试变能执行他的所有类型的自动化测试。当然,在生活中也有类似的,比如电脑,由CPU、磁盘、显卡等部分组成,一辆车由轮胎、车体、发动机等部件构成,客户在买车的时候并不知道该车是如何组装的,他只需要会开这辆车就行了。在设计模式中,我们将类似的复杂对象的各个部分按照一定的算法组合在一起,这种对象的创建工作便称为建造者模式。简介定义建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象,将复杂的构建与...
            4 4 966
            分享
          • 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。测试的策略:接口测试也是属于功能测试,所以跟我们以往的功能测试流程并没有太大区别,测试流程依旧是:评审测试接口文档(需求文档);根据接口文档编写测试用例(用例编写完全可以按照以往规则来编写,例如等价类划分,边界值等设计方法);执行测试,查看不同的参数请求,接口的返回的数据是否达到预期。那么设计测试用例时我们主要考虑如下几个方面:功能测试:接口的功能是否正确实现了;接口是否按照设计文档中来实现(比如user...
            12 12 2667
            分享
      • 51testing软件测试圈微信