CarrierWaveでpng画像を処理したときに色空間がGRAYになってしまってた

バージョン

  • 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を指定してたんだけど、これでは問題は解決できなかったのでちょっとハマった・・。

タイトルとURLをコピーしました