バージョン
- ruby 2.6.1
- Ruby on Rails 5.2.3
- MacOS Catalina 10.15.1
- ImageMagick 7.0.9-5
- gem mini_magick 4.9.5
- gem carrierwave 1.3.1
問題
CarrierWaveでMiniMagickを使って画像を処理する時。例えば、resize_to_fit とかresize_and_pad とか resize_to_fill とかを使うと、png画像の色空間が元々RGBだったのにGRAYになってしまう現象があった。
調査
どうやら、色空間をカラーで持っていても、グレイスケールっぽい画像だとImageMagickがカラースペースをグレイスケールに変換してしまうようだった。
なぜ・・、やめてくれ・・!
解決方法
上記した resize_to_fit とかのメソッドには、 combine_options という名前付き引数が渡せる。これはImageMagickのオプションと対応しているので、とにかく大量のものが指定できて、その中で、png画像での色の設定は、-define
オプションでpng:color-type=?
を指定できる。
今回はRGBAで色情報を持ってほしかったので、png:color-type=6
となる。
つまり、combine_options: {define: 'png:color-type=6'}
を指定することで解決した。
Carrierwaveがどうとかいう問題ではなく、ImageMagick側の話だったようだ。
注意
これで解決したんだけど、このオプションは要注意なことが書いてあるので、png:color-typeの説明は見ておいた方が良さそう。
最初は色空間が変わるという現象だったから、combine_optionsに-colorspace sRGB
を指定してたんだけど、これでは問題は解決できなかったのでちょっとハマった・・。