App瘦身-图片批量压缩工具-TinyPNG的批处理

前言

App瘦身是老生常谈了,图片压缩算是一种最没有技术含量,但效果也最好的方法。
图片压缩的工具有很多,有比这个更好也更方便的,但这里使用TinyPNG,原因有2个,一是很久以前就在用,经过了时间的考验,二是出于兴趣给自己写了专用的工具,用起来也很方便。
最近在整理8年来的代码,就将这个工具的代码重构一下,并开放到github上供有同样兴趣的人互相学习。

最后:tinypng是个好网址,每月有500次的免费次数。身为一个程序猿,看到这个限制自然会忍不住把工具写成了可以设置多个key,但这只涉及兴趣,可以讨论和学习。实际上500次已经足够大家使用了,很少有项目每月增加500张图片这么多,就算偶尔超出,收费也并不贵。大家有条件的话尽量付费使用。

项目

源文件:
https://github.com/pkgogai/GYDFoundation/blob/master/GYDShellTools/Code/批量图片压缩/GYDShellTinifyTools.h
可执行文件:(githubusercontent连不上的原因可自行百度,或者clone整个项目后去对应位置拿取)
https://github.com/pkgogai/GYDFoundation/blob/master/Help/tinify/compress_image.zip

流程

准备工作:

  1. 从官网申请key。https://tinypng.com/developers
  2. 准备图片所在目录的路径,会深度遍历处理。
  3. 再准备一个用来记录处理情况的文件路径,处理结果会保存到这里,以便每次只做增量处理。

工具执行步骤:

  1. 输入参数:
    • key: 权限,有多个key的话用逗号分隔。
    • path: 图片路径。
    • log: 记录文件路径。
  2. 准备图片:
    • 遍历路径找出所有png图片。
    • 使用记录文件筛选出没处理过的图片。
    • 从大到小排序。
  3. 处理图片:
    • 使用官网api处理每张图片。
    • 一个Key次数用尽则换下一个Key。
    • 成功后直接替换原文件。
    • 保存记录。
  4. 结束情况:
    • 处理完成。
    • 所有key的次数用尽。
    • 出错:网络、文件读写等错误。

实现

官方API

官网上还有更简单的api,但因为床铺对我的眷恋,没有进行尝试。
https://api.tinify.com/shrink
POST
header填充 Authorization : Basic base64(api:$"key"),伪代码:

key = 网站上申请到的key;
token = base64("api:"+key);
header["Authorization"] = "Basic " + token;

body为图片文件数据。

处理成功的返回

    {
         input =     {
             size = 91733;
             type = "image/png";
         };
         output =     {
             height = 1334;
             ratio = "0.2585";
             size = 23711;
             type = "image/png";
             url = "https://api.tinify.com/output/gah3v1eexhmty1gt8ujhjfhge2gbf1g2";
             width = 750;
         };
     }

处理失败的情况我们只关注一个,http状态码429表示次数用光。

记录处理结果

对于处理结果,这里只记录一个md5,没必要记录文件名等其它信息。如果真有没压缩的图片和压缩过的图片不一样,md5却相同,遇到这种千年难遇的情况也只是少压一个文件而已,无伤大雅。
文件格式:plist,结构:字典,文件的md5为key,value如表:

value 说明 判定条件
-1 已压缩到极致 压缩后md5没有变化
0 没处理 这种情况不会记录,所以不存在
1 已压缩 至少经过经过了1次压缩(原本想记录压缩次数,但后来感觉没必要)

注:不用数据库的原因是,文本文件记录更利于git处理。

源码接口

刚发现是否深度遍历的参数忘记处理了,现在必定深度遍历。

@interface GYDShellTinifyTools : NSObject
/** 权限 */
@property (nonatomic, copy, nullable) NSArray<NSString *> *apiKeys;

/** 压缩一张图片,如果换别的压缩工具,就修改这里吧 */
- (nullable NSData *)imageDataForCompressImageData:(nonnull NSData *)imageData output:(out NSString * _Nullable * _Nullable)output;

/**
 批量压缩一个目录中的图片并直接替换
 @param path 目录路径
 @param resursive 目录是否递归查找
 @param filePath 记录处理状态到文件,以便下次跳过已处理的文件
 */
- (BOOL)compressImagesAtPath:(nonnull NSString *)path resursive:(BOOL)resursive historyFile:(nullable NSString *)filePath;

@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容