Help us understand the problem. What is going on with this article?

サーバーサイドでjpegを軽量化(jpeg-miniみたいな事)

More than 5 years have passed since last update.

コマンドラインから簡単に特定フォルダ以下のjpegをjpeg-miniみたいに軽量化できないものかなと思って探していたらstackoverflowにまとめてありました。

http://stackoverflow.com/questions/19153122/image-compression-tools-via-command-line

その中で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を軽量化できてスッキリしました。

tkosuga@github
札幌でウェブプログラマしてます。ウェブ技術全般ブログはじめました
http://tkosuga.hateblo.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away