TinyPNGのブラウザ版は優秀だけど、効率が悪い
いつも、ブログに画像を載せる時、Lightroomで書き出し→ブラウザ版の「TinyPNGのWEB」で圧縮している。

正直、めんどくさい・・・
面倒な時は、圧縮していない時もあるし、サイズ制限をして、小さく書き出したりもしている。
サイト自体は大きくないし、特に問題はないレベルです。
一応、wordpressにはプラグインを入れていて、WebPに変換してくれるようにしている。
WebPは優秀だけど、時々、jpgよりも大きくなることもあるし、昔のブラウザとかは対応していない。そんなことまで考えなくていいかなとも思うレベルではあります。
そんな訳で、WebPで直接アップロードしない仕様に今のところしていて、pngかjpg位で良いかなと思ってます。
TinyPNGをWEB版を使わないでMacで圧縮できないか?
TinyPNGをMacの自動化、「Automator」で使えたら楽じゃない?
と考えていて、「TinyPNG Developer API」を使えば出来ることが判明!
「TinyPNG Developer API」は、毎月 500 枚まで無料。これを超えたら、いつも通りのWEBで行えば良い。
TinyPNG Developer APIを使ってMacのAutomatorで動かす
「TinyPNG Developer API」と、Macの「Automator」を組み合わせて、クリックだけで画像を圧縮できるようにしてみました。健忘録としてここに残しておきます。
1. TinyPNG API キーを取得する
「TinyPNG Developer API」でアカウントを作成してAPIキーを取得する。
TinyPNG Developer APIのURLは→https://tinify.com/developers
メールが送られてきてダッシュボードにアクセスするとAPIキーが見られるのでAPIキーをメモする。
ダッシュボードのURLは→https://tinify.com/dashboard/api

2. Automatorでクイックアクションを作成
2-1 Macでアプリケーション→「Automator 」を開く

2-2 クイックアクションを追加する
「クイックアクション」を選択し、下の「選択」ボタンを押す。

2-3 シェルスクリプトを追加
ユーティリティ→「シェルスクリプトを実行」を選択し、横にドラッグする。

ワークフローが受け取る現在の項目を「画像ファイル」にする。
入力の引き渡し方法を「引数として」にする。

シェルスクリプト内(緑の枠)に、もともと入っている内容を削除して、以下のスクリプトを貼り付け。
※「API_KEY」は自分のAPIキーに置き換える
保存の名前を好きな名前に決めて保存する。
#!/bin/zsh
# TinyPNG APIキー
API_KEY="ご自分のAPIキーを入力ください"
# 圧縮上限(テストするときは、ここを減らして設定)
LIMIT=500
LOCK_FILE="/tmp/tinypng_quick.lock"
COUNT_FILE="/tmp/tinypng_quick_count.txt"
# 同時実行防止
if [ -f "$LOCK_FILE" ]; then
exit
fi
touch "$LOCK_FILE"
# カウントリセットの確認
RESET=$(osascript -e 'display dialog "クイックアクションカウントをリセットしますか?" buttons {"キャンセル","リセット"} default button "キャンセル"')
if [[ "$RESET" == *"リセット"* ]]; then
echo 0 > "$COUNT_FILE"
osascript -e 'display notification "カウントをリセットしました" with title "TinyPNG"'
fi
# カウントファイルがなければ作成
if [ ! -f "$COUNT_FILE" ]; then
echo 0 > "$COUNT_FILE"
fi
# 現在のカウントを読み込む
TOTAL=$(cat "$COUNT_FILE")
# 処理した枚数
processed=0
for f in "$@"
do
# jpg/png以外はスキップ
if [[ ! "$f" =~ \.(jpg|jpeg|png)$ ]]; then
continue
fi
# _tiny ファイルはスキップ
if [[ "$f" == *_tiny.* ]]; then
continue
fi
# 上限到達なら終了
if [ $TOTAL -ge $LIMIT ]; then
osascript -e 'display dialog "圧縮枚数が上限に達しました。" buttons {"OK"} default button "OK"'
break
fi
# 出力ファイル名
OUT="${f%.*}_tiny.${f##*.}"
# 既に圧縮済みならスキップ
if [ -f "$OUT" ]; then
continue
fi
# TinyPNG APIに送信して圧縮
URL=$(curl -s --user api:$API_KEY \
--data-binary @"$f" \
https://api.tinify.com/shrink \
| jq -r '.output.url')
# 圧縮画像をダウンロード
curl -s --user api:$API_KEY -o "$OUT" "$URL"
((processed++))
((TOTAL++))
done
# カウントを更新
echo "$TOTAL" > "$COUNT_FILE"
# ロック解除
rm "$LOCK_FILE"
保存場所は勝手に保存されるので、不安だったら以下の所に保存されてあるはず!
/Users/自分のmac/Library/Services
3. Macに「jq」をインストールする

TinyPNG APIでは、圧縮後の画像URLを取得するのにJSONが必須!
ターミナルを開いて以下を入力して「jq」をインストールする。
brew install jq
4. Automator でTinyPNGを実際に動かす
画像を右クリック(control+クリック)して、「クイックアクション」→先ほど自分で作ったファイル(私の場合は「TinyPNG」としたので、「TinyPNG」を選択。

複数画像を選択してもOK!

「クイックアクションカウントをリセットしますか?」とポップアップが、毎回出てきて鬱陶しいかもしれないけど、
適当に月初になったらリセットすると無料枠の500をカウントしてくれる仕様。
500で「圧縮枚数が上限に達しました。」と出て、これ以上は出来ない仕様!
毎回、リセットするか聞いてきて鬱陶しいっちゃ鬱陶しいけど、
どこかでリセットしたいしね。

毎月自動でリセット出来るようにしたいけど…?
とりあえず、これで使ってみることに。
WEB版より、Macのみで完結するし、結構楽です!

これで、右クリックだけで画像が圧縮されるね!
こちらの記事は、あくまでも健忘録です。
Macのみでしか動作しません。
試される方は、自己責任でお願いいたします。
コメント