railsでcarrierwaveとimagemagick使って画像圧縮＆画像アップロードする。

画像を圧縮して保存するためにcarrierwaveとimagemagickとpiet使ってみた。

# 環境
Macbook Pro (2.6 GHz Intel Core i5)
macOS X 10.10.5
rails 4.2.3
[carrierwave](https://github.com/carrierwaveuploader/carrierwave) 0.10.0
[imagemagick](http://www.imagemagick.org/) 6.9.1-10
[rmagick](https://github.com/rmagick/rmagick) 2.15.4
[piet](https://github.com/albertbellonch/piet) 0.2.2

# Gemfile
一通り追加してbundle installする。

```ruby:Gemfile
  gem 'carrierwave'
  gem 'piet'
  gem 'rmagick'
```

```bash
$ bundle install
```

# imagemagick
普通に最新をインストールしてrails起動したらrmagickとバージョン合ってねーと怒られた。

```bash
$ rails s
Uncaught exception: This installation of RMagick was configured with ImageMagick 6.9.1 but ImageMagick 6.9.2-3 is in use.
```

brew logで適切なバージョン（ここでは6.9.1）を探す。

```bash
$ brew log imagemagick
```

狙いのバージョンを取ってくる。

```bash
$ git checkout 20376e8fe12529cbac4cbe1a94654b90ae082335 /usr/local/Library/Formula/imagemagick.rb 
```

取れたか確認。

```bash
$ brew info imagemagick
imagemagick: stable 6.9.1-10 (bottled), HEAD
Tools and libraries to manipulate images in many formats
http://www.imagemagick.org
/usr/local/Cellar/imagemagick/6.9.2-3 (1448 files, 22M) *
  Poured from bottle
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/imagemagick.rb
==> Dependencies
...
```

再インストールする。先にunlinkするのを忘れずに。

```bash
$ brew unlink imagemagick
Unlinking /usr/local/Cellar/imagemagick/6.9.2-3... 72 symlinks removed

$ brew install imagemagick
==> Downloading https://homebrew.bintray.com/bottles/imagemagick-6.9.1-10.yosemite.bottle.tar.gz
######################################################################## 100.0%
==> Pouring imagemagick-6.9.1-10.yosemite.bottle.tar.gz
🍺  /usr/local/Cellar/imagemagick/6.9.1-10: 1447 files, 22M
```

これでOK。

# optipng
homebrewでインストールした。

```bash
$ brew install optipng
==> Downloading https://downloads.sourceforge.net/project/optipng/OptiPNG/optipng-0.7.5/optipng-0.7.5.tar.gz
==> Downloading from http://jaist.dl.sourceforge.net/project/optipng/OptiPNG/optipng-0.7.5/optipng-0.7.5.tar.gz
######################################################################## 100.0%
==> Patching
patching file src/optipng/osys.c
==> ./configure --with-system-zlib --prefix=/usr/local/Cellar/optipng/0.7.5 --mandir=/usr/local/Cellar/optipng/0.7.5/share/man
==> make install
🍺  /usr/local/Cellar/optipng/0.7.5: 6 files, 156K, built in 14 seconds
```

# jpegoptim
こちらも同様。

```bash
$ brew install jpegoptim
==> Downloading https://homebrew.bintray.com/bottles/jpegoptim-1.4.3.yosemite.bottle.1.tar.gz
######################################################################## 100.0%
==> Pouring jpegoptim-1.4.3.yosemite.bottle.1.tar.gz
🍺  /usr/local/Cellar/jpegoptim/1.4.3: 6 files, 72K
```

# carrierwaveの設定
こんな感じで。

```app/aploaders/image_uploader.rb
class ImageUploader < CarrierWave::Uploader::Base
  include CarrierWave::RMagick
  include Piet::CarrierWaveExtension

  # resize_to_fit(): そのサイズに合うようにリサイズ。（大きくなることがある。）
  # resize_to_limit(): そのサイズより大きい画像のときに、そのサイズに合うようにリサイズ。（大きくなることはない。）
  version :icon do
    process resize_to_limit: [150, 150]
  end

  process convert: 'jpg'
  process optimize: [quality: 50]

  def extension_white_list
    %w(jpg jpeg gif png)
  end

  def filename
    'hogehoge.jpg' if original_filename.present?
  end
end
```

これでいい感じに圧縮かかるはず。
圧縮はそこそこ時間かかる。（400KBの画像を3枚に圧縮かけるのに1秒くらい）