TinyPNG APIでブログ画像を自動圧縮する方法

AI・自動化

※本記事はアフィリエイト広告(PR)を含みます

ブログのアイキャッチや図解、そのまま貼ると重くて表示が遅くなりますよね。この記事ではTinyPNGのAPIとPythonを使い、フォルダ内の画像をまとめて自動圧縮する手順を紹介します。所要時間は約15分。必要なものはPython環境とTinyPNGの無料APIキーだけです。

画像の重さって地味だけど表示速度に効くんだよね。手動で1枚ずつ圧縮してたら日が暮れるから、まとめて自動化しちゃおう!

TinyPNGとは?なぜAPIで自動化するのか

TinyPNGはPNG・JPEGを画質をほぼ落とさず圧縮できるサービスです。ブラウザにドラッグして使うこともできますが、記事を量産すると毎回手作業になります。

APIを使えば「フォルダに画像を入れて実行→圧縮済みが別フォルダに出力」まで自動化できます。無料枠は月500回まで圧縮できるので、個人ブログなら十分です(2026年6月時点。最新の上限は公式で確認してください)。

ステップ1:TinyPNGのAPIキーを取得する

1. 開発者ページで登録する

[画像: TinyPNG Developers の登録画面]

  1. https://tinypng.com/developers を開きます。
  2. 名前(Full name)とメールアドレスを入力し、「Get your API key」をクリックします。
  3. 届いたメール内のリンクを開くと、ダッシュボードに移動します。

2. APIキーをコピーする

ダッシュボードの「API key」欄に表示される文字列をコピーします。後でコードに貼り付けます。

APIキーはパスワードと同じ。GitHubに上げるコードに直書きしないで、環境変数か別ファイルに分けておくと安心だよ。

ステップ2:Pythonライブラリを準備する

公式のtinifyライブラリを使います。ターミナルで次を実行してください。

pip install tinify

Pythonは3.8以降を想定しています。pipが見つからない場合はpython -m pip install tinifyを試してください。

ステップ3:まず1枚だけ圧縮してみる

いきなり一括処理する前に、1枚で動作確認するのがおすすめです。input.pngを用意して、次のコードをcompress_one.pyとして保存します。

import tinify

tinify.key = "ここにAPIキー"

source = tinify.from_file("input.png")
source.to_file("output.png")

print("今月の圧縮回数:", tinify.compression_count)

実行します。

python compress_one.py

output.pngが生成され、ファイルサイズが小さくなっていれば成功です。compression_countで今月あと何回使えるかを把握できます。

実際に試したところ、私の環境では1.8MBのスクショPNGが約400KBまで落ちました。見た目はほぼ変わらず、圧縮率はおよそ8割でした(画像の内容により差があります)。

ステップ4:フォルダ内の画像をまとめて圧縮する

本題です。imagesフォルダに元画像を入れ、圧縮済みをcompressedフォルダに出力します。batch_compress.pyとして保存してください。

import os
import tinify

tinify.key = "ここにAPIキー"

src_dir = "images"
dst_dir = "compressed"
os.makedirs(dst_dir, exist_ok=True)

exts = (".png", ".jpg", ".jpeg")

for name in os.listdir(src_dir):
    if not name.lower().endswith(exts):
        continue
    src_path = os.path.join(src_dir, name)
    dst_path = os.path.join(dst_dir, name)
    try:
        tinify.from_file(src_path).to_file(dst_path)
        print(f"OK: {name}")
    except tinify.errors.AccountError:
        print("APIキーが不正、または無料枠を使い切りました")
        break
    except Exception as e:
        print(f"NG: {name} ({e})")

print("完了。今月の圧縮回数:", tinify.compression_count)

ポイントは、1枚エラーが出てもtry/exceptで止めず、次の画像へ進む点です。無料枠を使い切ったAccountErrorのときだけループを抜けます。

ステップ5:リサイズも同時に行う(任意)

アイキャッチを横幅1200pxに統一したいなら、圧縮と同時にリサイズできます。to_fileの前に1行足すだけです。

source = tinify.from_file(src_path)
resized = source.resize(method="scale", width=1200)
resized.to_file(dst_path)

method="scale"は縦横比を保ったまま幅だけ指定します。元画像より大きくは拡大されないので、貼り付け前のサイズ統一に便利です。

リサイズ1回も圧縮1回としてカウントされるよ。無料枠を節約したいなら、まず幅を決めてからまとめて処理するのがコツ!

つまずきポイントと対処

tinify.errors.AccountErrorが出る
APIキーの打ち間違いか、月500回の上限超過が大半です。ダッシュボードでキーと残り回数を確認しましょう。文字列の前後に空白が混ざっているケースもよくあります。

ConnectionErrorが出る
ネットワークかプロキシの問題です。社内ネットや一時的な不調が原因のことが多いので、時間を置くか別回線で再実行します。

圧縮済みが元より大きい・変わらない
すでに最適化済みの画像は、ほとんど縮みません。これは異常ではなく正常な挙動です。

回数を無駄に消費してしまう
テスト中は1枚(ステップ3)で確認し、本番の一括処理は元画像をバックアップしてから実行すると安全です。compression_countをこまめに確認する癖をつけましょう。

まとめ

  • TinyPNGのAPIキーを取得し、pip install tinifyで準備する
  • まず1枚で動作確認してから、フォルダ一括処理に進む
  • resizeで幅を統一でき、compression_countで残り回数を管理できる

これで、記事ごとに画像を手動圧縮する手間がなくなります。次のアクションとしては、この圧縮スクリプトをアイキャッチ生成や投稿の流れに組み込み、「生成→圧縮→アップロード」まで一気通貫にすると、さらに作業が楽になります。

PR: 未経験からの転職 Pythonでキャリアを変える【Python Winner】

無料カウンセリング・受講相談から参加可能、Python習得によるIT転職支援。

未経験からの転職 Pythonでキャリアを変える【Python Winner】の詳細・無料登録はこちら

コメント

タイトルとURLをコピーしました