コマンドラインから簡単に特定フォルダ以下のjpegをjpeg-miniみたいに軽量化できないものかなと思って探していたらstackoverflowにまとめてありました。
その中でAdeptが良さそうなので試してみた手順です。
Adept - the adaptive JPG Compressor
https://github.com/technopagan/adept-jpg-compressor
試した環境はCentOS6.5です。
shを取得して実行権限をつけます。
wget --no-check-certificate https://raw.githubusercontent.com/technopagan/adept-jpg-compressor/master/adept.sh
chmod +x adept.sh
adept.shは色々なモジュールを組み合わせて動作するので、ここからの準備が長くなります。
次にjpegrescanを取得。同じく実行権限をつけます。
JPEGrescan: losslessly shrink any JPEG file
https://github.com/kud/jpegrescan
wget --no-check-certificate https://github.com/kud/jpegrescan/blob/master/jpegrescan
chmod +x jpegrescan
jpegrescanはperlを使うのですが、File::Slurpが見つからないとエラーが出ました。cpanからFile::Slurpを入れましょう。
yum install perl-CPAN
perl -MCPAN -e shell
そのままinstall File::Slurp をしたらエラーになりました。解決するために20分ぐらい時間かかりましたがcpanの中からupgradeします。
upgrade
いろいろたくさん更新されたと思います。これでFile::Slurpをインストールできるようになります。YAMLは毎回警告でるので同時に入れました。
install YAML
install File::Slurp
次にimagemagickをインストールします。imagemagick6.6以上が必要と書いてあり、今回の環境のCentOS6.5でyum install を使うと6.5がインストールされるため、一回yumから削除します。
yum remove ImageMagick
次に最新版(2014/7/1時点で6.8.9-5)をソースコードからインストールします。なぜソースコードからかと言うと、rpmでインストールしようとしたら失敗したからです。
その前にimagemagickの最新版が利用するライブラリをインストールしましょう。めっちゃあります。もしかすると必要ないのも混ざっているかも知れません。
yum install jpegoptim
yum install bzip2-devel freetype-devel libjpeg-devel libpng-devel libtiff-devel giflib-devel zlib-devel ghostscript-devel djvulibre-devel libwmf-devel jasper-devel libtool-ltdl-devel libX11-devel libXext-devel libXt-devel lcms-devel libxml2-devel librsvg2-devel OpenEXR-devel
yum install openexr fftw3
ソースコードを取得してmakeします。
wget http://www.imagemagick.org/download/ImageMagick.tar.gz
./configure --prefix=/usr/local/
make
make install
imagemagickをインストールできたら、共有ライブラリの依存関係を更新しましょう。
ldconfig /usr/local/lib
次にmss-saliencyを取得。make cleanしないとzip内に違う環境で作られただろう中間ファイルが含まれているのでmakeに失敗しました。
Regions of Interest Maximum Symmetric Surround Saliency Algorithm
https://github.com/technopagan/mss-saliency
wget https://github.com/technopagan/mss-saliency/archive/master.zip
unzip master
cd mss-saliency-master/Release
make clean
make
これでSaliencyDetectorが作られます。実行権限をつけます。
chmod +x SaliencyDetector
さあ下準備ができました。動くか試してみましょう。
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
./adept.sh /path/to/jpeg/image.jpg
末尾に_adept_compress.jpgと付いたファイルが生成されていれば成功です。
次に特定フォルダ内のjpeg画像を全て軽量化します。ここでは軽量化後のファイルは上書きしてしまいます。
まず中間ファイルの生成するパスを書き換えます。
vi adept.sh
TILESTORAGEPATHを/tmpにしましょう。
#TILESTORAGEPATH="/dev/shm/"
TILESTORAGEPATH="/tmp/"
次にsuffixを空にします。この行の上に書いてある説明を見ると、空文字を指定するとファイルを同名で上書きするようです。
#OUTPUTFILESUFFIX="_adept_compress"
OUTPUTFILESUFFIX=""
次に特定フォルダ以下全部のjpegを軽量化します。ここだけrubyのスクリプトです。
module Task
class JpegCompressor
def compress
Dir.glob('./public/images/main/*.jpg').each{|path|
puts "compress -> #{path}"
Process.fork do
Process.exec({"PATH" => "$PATH:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/tkosuga/bin:/home/tkosuga/public_html/xxxx", "PKG_CONFIG_PATH" => "$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig"}, "./adept.sh #{path}")
end
Process.waitall
}.size
end
end
end
手順はここまでになります。
サーバーサイドでコマンドラインからまとめてjpegを軽量化できてスッキリしました。