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

コマンドラインから簡単に特定フォルダ以下の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を取得して実行権限をつけます。

```bash
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

```bash
wget --no-check-certificate https://github.com/kud/jpegrescan/blob/master/jpegrescan
chmod +x jpegrescan
```

jpegrescanはperlを使うのですが、File::Slurpが見つからないとエラーが出ました。cpanからFile::Slurpを入れましょう。

```bash
yum install perl-CPAN
perl -MCPAN -e shell
```
そのままinstall File::Slurp をしたらエラーになりました。解決するために20分ぐらい時間かかりましたがcpanの中からupgradeします。

```bash
upgrade
```

いろいろたくさん更新されたと思います。これでFile::Slurpをインストールできるようになります。YAMLは毎回警告でるので同時に入れました。

```bash
install YAML
install File::Slurp 
```

次にimagemagickをインストールします。imagemagick6.6以上が必要と書いてあり、今回の環境のCentOS6.5でyum install を使うと6.5がインストールされるため、一回yumから削除します。

```bash
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します。

```bash
wget http://www.imagemagick.org/download/ImageMagick.tar.gz
./configure --prefix=/usr/local/
make
make install
```

imagemagickをインストールできたら、共有ライブラリの依存関係を更新しましょう。

```bash
ldconfig /usr/local/lib
```

次にmss-saliencyを取得。make cleanしないとzip内に違う環境で作られただろう中間ファイルが含まれているのでmakeに失敗しました。

Regions of Interest Maximum Symmetric Surround Saliency Algorithm
https://github.com/technopagan/mss-saliency

```bash
wget https://github.com/technopagan/mss-saliency/archive/master.zip
unzip master
cd mss-saliency-master/Release
make clean
make
```

これでSaliencyDetectorが作られます。実行権限をつけます。

```bash
chmod +x SaliencyDetector
```

さあ下準備ができました。動くか試してみましょう。

```bash
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
./adept.sh /path/to/jpeg/image.jpg
```

末尾に_adept_compress.jpgと付いたファイルが生成されていれば成功です。

次に特定フォルダ内のjpeg画像を全て軽量化します。ここでは軽量化後のファイルは上書きしてしまいます。

まず中間ファイルの生成するパスを書き換えます。

```bash
vi adept.sh
```

TILESTORAGEPATHを/tmpにしましょう。

```bash
#TILESTORAGEPATH="/dev/shm/"
TILESTORAGEPATH="/tmp/"
```

次にsuffixを空にします。この行の上に書いてある説明を見ると、空文字を指定するとファイルを同名で上書きするようです。

```bash
#OUTPUTFILESUFFIX="_adept_compress"
OUTPUTFILESUFFIX=""
```

次に特定フォルダ以下全部のjpegを軽量化します。ここだけrubyのスクリプトです。

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