JPEGファイルを劣化させないで容量削減したよ
どうも最近更新を怠っているのは、とあるWebサイト開発に熱中しているからです。完成したらここでも紹介するかもしれません。
今回は、Webに載せる画像、特にJPEGファイルを軽量化(最適化)するということをやっていきます。今回はお手軽さを求めて、CUIで実行できる”jpegtran”というものを使っていきます。
JPEGは非可逆の圧縮方針なので、画質を犠牲にすればいくらでも容量を減らすことができますが、今回は劣化させないというところがミソ(?)です。
OS : Ubuntu 16.04 LTS
OS : CentOS 6.8
1. Jpegtranのインストール
さて、まずはインストールです。作業環境によって、もしかしたら既にインストールされているかもしれません。自分の端末では、Ubuntuには入っていませんでしたが、VPSで利用しているGMOさんのサーバ(CentOS6.8)ではすでに入っていました。
インストールは簡単で、以下のコマンドを実行するだけです。
1 2 3 4 5 6 7 8 9 10 11 |
$ # Ubuntu $ sudo apt-get install libjpeg-progs $ # CentOS $ sudo yum install libjpeg $ # Mac + Port $ sudo port install jpeg $ # Mac + Homebrew $ brew install jpeg |
これらの中からご自身の環境にあったものを選択してインストールしてください。なお、Ubuntu以外は未検証なのであしからず。
インストールが完了した後”jpegtran”というコマンドを実行してみてNotFoundが帰ってこなければインストール完了だと思います。
2. 基本的なコマンド
では、今インストールしたコマンドの使用テストをしてみます。まずはお手元に被験者となる、Jpeg形式の画像ファイルを用意してください。ある程度大きいファイルの方が結果が出やすいのでオススメです。
画像の準備ができたら、以下のコマンドを実行してください。このコマンド内の”a.jpg”が入力ファイル、そして”b.jpg”が出力ファイルです。
1 |
$ jpegtran -copy none -optimize -outfile b.jpg a.jpg |
ちらっと、上記のコマンドのオプションの説明をします。
“-copy none” : メタ情報を削除する
“-optimize” : なんかいい感じのメソッドを使う
“-outfile” : 出力先ファイル名
ちなみに結果はこんな感じになりました。
入力画像(454,006 bytes)
出力画像(401,323 bytes)
見かけの劣化は無いと思われます。やはり劣化なしだと削減できる容量に制限がありますね。
3. ディレクトリ内をまとめて最適化
さて、最後におまけのコードを載せて終わろうと思います。今回は、Python3で特定のディレクトリ内にある画像ファイル群をまとめて最適化していくというコードを書きました。やっていることは至極単純で、”glob”によって取得してきたファイルパス群をもとに、”subprocess”によって”jpegtran”を実行して処理させているだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#coding:utf-8 import glob import subprocess def optimize_jpeg(in_img): result = subprocess.call('jpegtran -copy none -optimize -outfile '+ in_img +' '+ in_img +' > /dev/null 2>&1', shell=True) return True if result == 0 else False files = glob.glob('./imgs/*.jpg') for f in files: optimize_jpeg(f) |
このコードを実行すると”imgs”というディレクトリ内にある”jpg”形式のファイル群を対象に最適化を行っています。もし「imgディレクトリの中にある様々なディレクトリ群の内にある画像群」に対して最適化を行いたい場合は、”glob”の引数の部分を(‘./imgs/*/*.jpg’)とすれば大丈夫です。
おわりに
さて、今回はJPEGファイルの容量削減をやってきました。今回も先人様の作ってくださった道具を使うことで簡単にできちゃいました。多少削減量は少ないかもしれませんが、お手軽というのは良いことですね。
もしこれ以上削減したければ、画質を劣化させて処理するか、画像サイズを縮小してしまうという手法があると思います…が、今回はここまで、お疲れ様でした。
「Webで使用する画像ファイルの最適化」