Python批量压缩图片(TinyPNG)

article/2025/9/9 21:48:06

    • Python批量压缩图片(TinyPNG)
        • 什么是TinyPNG?
        • Mac客户端
        • 申请/查看Developer API
        • 环境准备
        • Python脚本
        • 执行批量压缩
        • 完整示例

Python批量压缩图片(TinyPNG)

什么是TinyPNG?

TinyPNG提供了PNG图片的“几乎无损”压缩服务。详细介绍TinyPNG

Mac客户端

Mac客户端下载地址
网上大多都是通过Python脚本实现,这里做一个简单的总结。

申请/查看Developer API

如果你是免费用户,那么每个developer key最多只能压500次,可通过多注册几个邮箱的方式解决次数的限制。
申请Key
这里邮箱不支持QQ邮箱
如果你之前有使用邮箱申请过API Key 可以登录来查看邮箱关联的API Key
发送登录链接至邮箱
TinyPNG平台没有密码机制自能发送邮件来关联登录
查看邮箱关联的API Key

环境准备

以下为笔者测试通过的Mac环境
1、Python版本2.7.10(Mac默认有安装Python)
查看Python 版本python -V,如果没有安装Mac电脑建议使用brew包管理工具安装brew install python
2、pip版本为10.0.1
pip安装参考文档

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.pypython get-pip.py

3、安装Python的tinify模板库

pip install --upgrade tinify

Python脚本

新建tinypng.py文件复制以下脚本并保存

#!/usr/bin/env python
# -*- coding: UTF-8 -*-import os
import sys
import csv
import os.path
import tinify
from PIL import Image
from optparse import OptionParser
#请替换为自己申请的Key
tinify.key = ""
png_path = []
png_path_compressed = []def get_png_path(inputPath):for p in os.listdir(inputPath):temp_path = os.path.join(inputPath,p)if os.path.isdir(temp_path):get_png_path(temp_path)else:if os.path.splitext(p)[1] == '.png' or os.path.splitext(p)[1] == 'jpg' or os.path.splitext(p)[1] == 'jpeg':print "PNG File:",os.path.join(inputPath,p)png_path.append(os.path.join(inputPath,p))        def compress_core(inputFile, outputFile, img_width):source = tinify.from_file(inputFile)if img_width is not None:resized = source.resize(method = "scale", width  = img_width)resized.to_file(outputFile)else:source.to_file(outputFile)def compress_path(path, width):print "compress_path-------------------------------------"if not os.path.isdir(path):print "这不是一个文件夹,请输入文件夹的正确路径!"returnelse:fromFilePath = path             # 源路径toFilePath = path+"/tiny"         # 输出路径print "fromFilePath=%s" %fromFilePathprint "toFilePath=%s" %toFilePathfor root, dirs, files in os.walk(fromFilePath):print "root = %s" %rootprint "dirs = %s" %dirsprint "files= %s" %filesfor name in files:fileName, fileSuffix = os.path.splitext(name)if fileSuffix == '.png' or fileSuffix == '.jpg' or fileSuffix == '.jpeg':toFullPath = toFilePath + root[len(fromFilePath):]toFullName = toFullPath + '/' + nameif os.path.isdir(toFullPath):passelse:os.mkdir(toFullPath)compress_core(root + '/' + name, toFullName, width)break                                    # 仅遍历当前目录# 仅压缩指定文件
def compress_file(inputFile, width):print "compress_file-------------------------------------"if not os.path.isfile(inputFile):print "这不是一个文件,请输入文件的正确路径!"returnprint "file = %s" %inputFiledirname  = os.path.dirname(inputFile)basename = os.path.basename(inputFile)fileName, fileSuffix = os.path.splitext(basename)if fileSuffix == '.png' or fileSuffix == '.jpg' or fileSuffix == '.jpeg':mkdir(dirname+"/tiny");png_path_compressed.append(dirname+"/tiny/"+basename)compress_core(inputFile, dirname+"/tiny/"+basename, width)else:print "不支持该文件类型!"def mkdir(path):  folder = os.path.exists(path)  if not folder:                   #判断是否存在文件夹如果不存在则创建为文件夹  os.makedirs(path)            #makedirs 创建文件时如果路径不存在会创建这个路径  print "---  new folder...  ---"  print "---  OK  ---"  else:  print "---  There is this folder!  ---"  def run(file, dir=None, width=None):if file is not None:print "仅压缩一个文件!"compress_file(file, width)                # 仅压缩一个文件passelif dir is not None:print "压缩指定目录下的文件!"compress_path(dir, width)                # 压缩指定目录下的文件passelse:print "压缩当前目录下的文件!"compress_path(os.getcwd(), width)        # 压缩当前目录下的文件def get_compressed_result():for png in png_path:run(os.path.abspath(png))rows = []row = ()for i in range(len(png_path)):img = Image.open(png_path[i])imgSize = img.sizebefore_compressed = os.stat(png_path[i]).st_sizeafter_compressed = os.stat(png_path_compressed[i]).st_sizeprint png_path[i],before_compressed,after_compressed,(before_compressed - after_compressed) *1.0/ before_compressedif imgSize[0] * imgSize[1] > 1024* 1024:too_large_scale = "True"else:too_large_scale = "False"row = (png_path[i],before_compressed,after_compressed,(before_compressed - after_compressed) *1.0/ before_compressed,imgSize[0],imgSize[1],too_large_scale)rows.append(row)header = [u'Path',u'before_compressed',u'after_compressed',u'compression_rate',u'width',u'height',u'too_large_scale']with open('compressed.csv','wb') as f:f_csv = csv.writer(f)f_csv.writerow(header)        f_csv.writerows(rows)if __name__ == "__main__":usage = '''python tinypng.py [options]-example: python tinypng.py -d xxx '''parser = OptionParser(usage)    parser.add_option('-d', dest='_path', help=u'(必选)指定游戏脚本路径')(options, args) = parser.parse_args()if not options._path:print '\n -d 参数必须设置!'print usagesys.exit(1) get_png_path(options._path)get_compressed_result()

执行批量压缩

进入tinypng.py文件所在目录执行以下命令

python tinypng.py -d ya

-d 后面为要压缩图片的文件夹路径

完整示例

要压缩的图片在/Users/Javen/Documents/dev/img/ya中,tinypng.py文件在/Users/Javen/Documents/dev/img/中,如下图所示
需要压缩的图片
执行压缩命令
执行压缩命令
压缩后效果图
压缩后效果图


http://chatgpt.dhexx.cn/article/53exUwHb.shtml

相关文章

[HFCTF 2021 Final]tinypng

1NDEX 0x00 前言seebug复习一下phar在php反序列化中的利用phar文件结构local_test 0x01 brain.mdlittle trick压缩phar绕过关键词 0x00 前言 seebug复习一下phar在php反序列化中的利用 参考https://paper.seebug.org/680/ 写的太好了… 直接粘了 phar文件会以序列化的形式存…

VSCode安装TinyPNG,并配置api key

1 打开VSCode 在【扩展】中搜索【TinyPNG】插件,并安装 2 添加api key 没有这一步,对文件进行压缩时会失败,提示 3 获取api key 3.1 打开tinypng网站 打开tingypng,滑动到最底部,打开Developer API 或者直接打…

破解tinypng文件上传的限制

简单破解tinypng文件上传的限制 /** * 帮助文档* -------* * 获取帮助* 指令 -h* * 获取命令执行文件夹 * 指令 -f * 参数 ./* 必填,待处理的图片文件夹* * 获取是否深度递归处理图片文件夹* 指令 -deep* 可选,默认不深度递归* * 命令行脚本参考示例* &…

TinyPNG批量压缩工具脚本Python

TinyPNG官网: https://tinypng.com/ TinyPNG是目前为止最为欣赏的图片压缩工具, 图片压缩比截图 1经过ps压缩之后,还能减少50%以上的体积,肉眼居然一点看不出压缩模糊的痕迹; 2相比于jpg,对png透明的图片,体积压缩更为出众; 3为开发者提供了api接口,支持多种后端语言。…

super-tinypng压缩图片

使用快捷键WinR,输入cmd,进入命令行 安装super-tinypng插件 npm i super-tinypng -g在图片文件夹输入该命令 super-tinypng压缩完后会生成一个output文件夹,里面是压缩后的图片

TinyPNG

TinyPNG使用智能有损压缩技术来减少*PNG文件的文件大小。通过选择性地减少图像中的颜色数量,存储数据所需的字节更少。PNG很有用,因为它是唯一可以存储部分透明图像的广泛支持的格式。格式使用压缩,但文件仍然很大。使用TinyPNG缩小应用和网站…

TinyPng图片压缩的正确打开方式

https://tinypng.com/ TinyPNG使用智能的「有损压缩技术」来减少WEBP、JPEG和PNG文件的文件大小。通过选择性地减少图像中的「颜色数量」,使用更少的字节来存储数据。这种效果几乎是看不见的,但在文件大小上有非常大的差别。 使用过TinyPNG的都知道&…

tinypng注册

首先你得用谷歌浏览器!!!!!!!!!!!!!!!!!!!&#xf…

TinyPNG 智能PNG和JPEG图片压缩

TinyPNG Smart PNG and JPEG compression (English) TinyPNG 智能PNG和JPEG图片压缩(中文版) TinyPNG做了什么? TinyPNG使用智能有损压缩技术将您的PNG文件的文件大小降低。 通过选择性的减少图片中的颜色&#xff0…

使用TinyPNG API压缩图片

使用TinyPNG API压缩图片 在撰写论文的时候,美观,大气,上档次的图标能够很好地给自己的论文加分,好的可视化结果也能够让审稿人赏心悦目。但是有时候在可视化图片的时候有可能原始图像过大从而很占内存;这时候就希望能…

FME读写cass数据的方案及操作流程

FME读写cass数据的方案及操作流程 一。CASS数据转换(一)读取南方CASS数据 南方CASS数据采用AutoCAD的DWG、DXF文件方式进行存储,用FME可以直接对DWG\DXF文件进行读取,但FME不能识别CASS扩展属性信息。在FME WorkBench中无法看到CA…

FME性能调整

FME性能调整 原文地址: https://knowledge.safe.com/content/kbentry/579/performance-tuning-fme.html 一、要素缓存 要素缓存(或在FME2017及以下版本中使用“全部检查运行”—Run with Full Inspection)允许你存储转换的中间结果并进行检…

【FME EXCEL】FME玩转EXCEL小记——不定期更新

目录 前言 本文记述FME使用过程中,对EXCEL操控心得,皆为平时的有感而发,故会不定时的更新。 模版的定义与使用 有如下一份成绩表,先存在两个问题,一个是所有同学的成绩少加了5分,另一个是登记表的位置不…

FME2019试用过程

FME2019试用过程 FME2019安装过程安装FME License安装FME Desktop FME2019安装过程 安装FME License AMPED —— 是 License 软件,先进入安这个 双击运行 一路安装 安完以后会弹出一个 hostid 的文本文件,如果没有去License的安装目录找 计算机名 网卡…

【FME小计】关于用户参数的设置

工作的时候遇到用户参数相关的需求:用户选择特定年份的时候,就运行特定年份数据。 该项需求的实现有两种方案: 使用Choice with Alias(带别名的选择),然后将该参数关联到数据表上(Feature to Re…

FME数据处理04:面自相交拓扑检查

在ArcGIS中仅提供了线要素的自相交拓扑检查,并未找到关于面要素自相交的相关表述;本文结合FME2019。列举了几种面自相交的情形,并介绍了FME中三个转换器及其设置方法。 关于ArcEngine的拓扑检查接口,可以参见基于C#的ArcEngine二次开发22:要素拓扑检查_小薛引路的博客-CS…

FME数据处理03:合并相接的线要素

1 问题描述 给定如下数据集: 上图中,选中的三条线段满足相接关系,但是是断开的;我们想将它们在断点处合并起来。 2 FME流程 主要是读取shp文件,调用LineCombiner转换器,将各线段从线段的相接点处连接起来。 Takes lines and connects them to form longer lines. Each…

FME动态转换

FME动态转换 什么是动态转换创建动态转换动态读模块动态写模块 动态结构处理动态结构动态要素类型动态属性结构几何定义 B站视频凑合看: 创建动态转换 结构处理(要素,属性,几何类型) 什么是动态转换 大多数转换要考虑源数据的结构&#xff…

FME助力新型基础测绘之存量测绘成果数据转换地理实体

​ 目前,新型基础测绘建设正在如火如荼地进行中,它是对传统基础测绘业务的转型升级,是测绘地理信息服务的发展方向和基本模式。要想充分了解新型基础测绘建设的核心内容,地理实体是必不可少的一个关键要素。 地理实体是指现实世…

使用FME 批量OSGB转FBX(OBJ) (亲测)

首先感谢这个UP主(这种好视频,必须支持):OSGB单体模型批量转FBX,并保留原有文件目录_哔哩哔哩_bilibili 视频地址:链接:https://pan.baidu.com/s/18JCTpgAhWT1l5x8zJW9q0A?pwdr25e 提取码&am…