Edited at

TinyPNGのWeb APIを使ってサーバーサイドでImage Optimize

More than 3 years have passed since last update.


概要

いま運用中のウェブサイトの表示スピードを速くしたいために、画像のOptimizeをしようと思い立ったが、

cloneしてjpgminiとかでやるのはめんどうで気が引けるし、なんとかしてサーバー側でできないかと調べてみたところ、かの有名な TinyPNG 様がなんと Web API をご用意して下さっていたので、これを使います。

すでにqiitaに記事があるかなぁと思っていたんですが、なさそうなのでメモとして残しておきます。


1. API KEY を取得する

TinyPNGの Developpers ページに行くと、名前とメールアドレスを入れる欄があるので、そこにデータを入力します。するとメールがくるので、貼ってあるリンクをたどってAPI KEYを取得します。


2. クライアントを選ぶ

TinyPNGは REST API のほか、Ruby, php, node.js, python, java, .net これらの言語でAPIを使うための

クライアントがあります。自分が使うのはPythonなので、今回のこの記事はPythonで書きます。

Pythonの場合は、tinify というクライアントがあるので、それをインストールします。

pip install tinify

こちらがAPI説明ページになってます。 https://tinypng.com/developers/reference/python


3. コードを書く

このクライアントを使うと、 たった2行 でOptimizeできちゃいます。

source = tinify.from_file("unoptimized.jpg")

source.to_file("optimized.jpg")

これだけ。 Simple is The BEST って感じでとてもいいですね。

ちなみにこの前にクライアントのimportとAPIキーの登録があります。

import tinify

tinify.key = "Your API KEY"


3.1. サンプルコード

ためしに、現在のディレクトリにある jpg or png ファイルをoptimizeするコードを書いてみました(py2.7

#!/usr/bin/env python

# coding: utf-8

import os
import sys
import tinify

TARGET_DIR = "."
tinify.key = "###################################"

def get_images():

result = []
files = os.listdir(".")

for file in files:

if file.endswith(".jpg") or file.endswith(".png"):
result.append(file)

return result

def optimize(source, dest, target_dir):

dest_path = os.path.join(target_dir, dest)

if os.access(source, os.F_OK) != True:

raise IOError("file not found: {}".format(source))

optimizer = tinify.from_file(source)
optimizer.to_file(dest_path)

return

if __name__ == "__main__":

images = get_images()

# test optimize
optimize(images[0], images[0], TARGET_DIR)


4. 注意事項

TinyPNGでは、無料ではひと月にアップロードできる画像は 500 個だけのようですので、そこは注意が必要です。