命令行压缩图片

Linux 下我常用的两个图片压缩工具就是:optipng 和 jpegoptim。
但是今天在谷歌网页加载测评中,这两个工具表现不佳。于是使用在线工具来压缩。

网址:https://tinypng.com
还有个姐妹站,自己百度,压缩 JPG 格式的图片。这里以 PNG 格式为例。

申请 API 直接点导航栏那里的开发者,输入邮箱名称即可。

API 申请

收到 API_KEY 之后可以使用 curl 来测试。

curl --user api:YOUR_API_KEY \
     --data-binary @unoptimized.png -i https://api.tinify.com/shrink

使用次数有限制,每个月500张。当然你可以换个邮箱申请什么的,一般来说个人用也不会超过500张的数量。


使用次数与收费

只是 curl 还是挺麻烦的,所以写成脚本来处理吧。
首先新建一个文件,名为 api.key,然后里面填写收到的 API_KEY。
新建脚本,内容如下,放在同一个目录中。

#!/usr/bin/bash
# 使用 TinyPNG 压缩图片

API_KEY=`cat "$(dirname $0)"/api.key`
API_URL=https://api.tinify.com/shrink

# 压缩后的文件保存在这里
output_dir=
# 要压缩的文件
files=()

show_help() {
  echo -e \
"使用 TinyPNG 压缩图片的脚本,默认覆盖原文件。支持 png 和 jpg 格式。
Usage: $0 [option] [file/directory]...
选项:
    -o [输出目录]      指定压缩后的文件保存目录,默认覆盖原文件。
    -h, --help           显示帮助信息。
}

# 检查输出目录是否存在,并尝试创建文件夹。
parse_output_dir() {
  if [[ "$1" = '-o' ]]; then
    # 确保以 '/' 结尾
    output_dir=${2%/}/
    if [[ -e "$output_dir" ]]; then
      if [[ ! -d "$output_dir" ]]; then
        echo "Error: $output_dir 不是一个目录。"
        exit 1
      elif [[ ! -w "$output_dir" ]]; then
        echo "Error: $output_dir 目录不可写"
        exit 1
      fi
    else
      mkdir "$output_dir" || exit 1
    fi
  fi
}

# 索引文件和目录,放进数组中等待处理。如果文件或者目录不存在则退出。
parse_files() {
  start=0
  if [[ -n "$output_dir" ]]; then
    start=2
  fi

  args=("$@")
  for (( i = $start; i <= $#; i++ )); do
    path=${args[$i]}
    if [[ -f "$path" ]]; then
      files+=($path)
    elif [[ -d "$path" ]]; then
      for file in "`find \"$path\" -type f -regex '.*\.\(png\|jpg\)'`"; do
        if [[ -n "$file" ]]; then
          files+=("$file")
        fi
      done
    fi
  done
}

# 逐一处理图片
minify_image() {
  local file=$1
  local response=`curl $API_URL -s --user api:$API_KEY --data-binary @"$file"`
  if [[ "$response" = *"\"error\""* ]]; then
    message=`echo "$response" | sed 's#.*"message":"\([^"]*\)".*#\1#'`
    if [[ -n "$message" ]]; then
      echo "$file: $message"
    else
      echo "$file: $response"
    fi
  else
    local url=`echo "$response" | sed 's#.*"url":"\([^"]*\)".*#\1#'`
    if [[ -n "$output_dir" ]]; then
      local output_path="$output_dir$file"
      local dir=`dirname $output_path`
      if [[ ! -d "$dir" ]]; then
        mkdir -p "$dir"
      fi
    else
      local output_path=$file
    fi
    curl $url -sSo "$output_path" --user api:$API_KEY
    if [[ "$?" = "0" ]]; then
      echo "$file: 压缩成功"
    else
      echo "$file: 下载失败"
    fi
  fi
}

if [[ "$#" = "0" || "$1" = "--help" || "$1" = "-h" ]]; then
  show_help
  exit
elif [[ -e "$API_KEY" ]]; then
  echo "请保证 api.key 位置与内容正。"
fi

parse_output_dir $@
parse_files $@

export API_KEY
export API_URL
export output_dir
export -f minify_image

if [[ "${#files[@]}" -lt "1" ]]; then
  echo "没有文件需要压缩"
else
  echo ${files[@]} | xargs -r -n1 -P10 bash -c 'minify_image "$@"' _{}
fi

源代码来自:
https://github.com/bianjp/image-minifier/blob/master/minify.sh

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

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,066评论 4 62
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • 今天似乎没那么急了~ 破冰~ 聊天~ 去回访意向顾客『得知已经用其他产品治疗好了~』 挖掘意向顾客~ 没成交~没出单~
    嘉玲小公举阅读 233评论 0 0
  • 不知道该怎么写。 明天你走,去那个我完全陌生的城市生活。 一觉过后,我们的距离,就会变的好远好远。 日子还是得一天...
    最爱不过与你阅读 366评论 0 0
  • 大片大片的云彩疏疏朗朗,浮在像是被澄洗过的蓝天,田野上的稻田绿了又黄,黄了又绿,在树林角上,平田的一隅,各处有新收...
    子兮子兮耶阅读 791评论 4 6