MacでTinyPNG APIを使って画像を自動圧縮する覚え書き

当ページのリンクには広告が含まれています。
目次

TinyPNGのブラウザ版は優秀だけど、効率が悪い

いつも、ブログに画像を載せる時、Lightroomで書き出し→ブラウザ版の「TinyPNGのWEB」で圧縮している。

ゆん

正直、めんどくさい・・・

TinyPNGの圧縮は優秀!

面倒な時は、圧縮していない時もあるし、サイズ制限をして、小さく書き出したりもしている。
サイト自体は大きくないし、特に問題はないレベルです。
一応、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

TinyPNG Developer APIは、無料枠で毎月 500 枚まで使えます!(執筆現在 2025/9)

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のみでしか動作しません。
試される方は、自己責任でお願いいたします。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

目次