アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

CMYK

こんにちは!! tahara です。 今回は Lisp on Rails はお休みで、Ruby on Rails の Paperclip の話題です。

IE で RGB の画像は表示できますが、CMYK の画像は表示できません。 CMYK から RGB に変換する手もありますが、変換時に結構色が変ってしまいます。 ということでアップロードする画像が CMYK の場合は、 バリデーションではじくようにします。

まず CMYK の判定ですが、ImageMagic の identify コマンドで可能です。

~% identify -format '%[colorspace]' ~/archive/normal.jpg
CMYK
~% identify -format '%[colorspace]' ~/archive/normal-rgb.jpg
RGB

ただし古い ImageMagic では -format '%[colorspace]' オプションが認識されないので -verbose オプションを使います。

~% identify -verbose ~/archive/normal.jpg
Image: /home/ancient/archive/normal.jpg
  Format: JPEG (Joint Photographic Experts Group JFIF format)
  Class: DirectClass
  Geometry: 290x200+0+0
  Resolution: 72x72
  Print size: 4.02778x2.77778
  Units: PixelsPerInch
  Type: ColorSeparation
  Endianess: Undefined
  Colorspace: CMYK      <=== これ!!
  Depth: 8-bit
  ...

この identify を呼び出して CMYK をチェックするバリデーションを config/initializers/paperclip.rb に組み込みます。

module Paperclip
  module ClassMethods
    ...

    # CMYKIE で表示できないため、検証でエラーとする。
    def validates_attachment_not_cmyk name, options = {}
      message = options[:message] || "CMYK フォーマットの画像はブラウザによって表示できないため使用できません。お手数ですが RGB フォーマットに変換してください。"
      attachment_definitions[name][:validations][:not_cmyk] = lambda do |attachment, instance|
        original_file = attachment.instance_variable_get(:@queued_for_write)[:original]
        colorspace =
          begin
            attachment.file? && original_file &&
              Paperclip.run("identify", "-verbose #{original_file.path}")
          rescue
            nil
          end
        if colorspace && colorspace =~ /^\s*Colorspace: CMYK$/
          message
        end
      end
    end
    ....

これでモデルから validates_attachment_not_cmyk というひどい名前のバリデーションが使えるようになります。

  validates_attachment_not_cmyk :picture_1

まとめるとこうなります。

(incf ImageMagic)
(decf IE most-positive-fixnum)