こんにちは!! 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 ... # CMYK は IE で表示できないため、検証でエラーとする。 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)