2017-12-16 26 views
1

私はBase64でエンコードされた画像をRoRアプリケーションにアップロードしています。私が画像を受け取ったとき、それはrgbのカラースキーム(正しい)を持っています。私がクリップにgemをアップロードするファイルに画像を書き込むと、画像のカラースキームはrgbからグレースケールに変わります。ここでRuby + RMagick + base64画像+ GrayScaleからのRGB変換が機能しません

コードです:

​​

カラースキームはグレーです:

source = src.gsub(/^data:image\/(png|jpg|jpeg);base64,/,"") 
blob = Base64.decode64(source) 
img = Magick::Image.from_blob(blob).first 
img.colorspace = Magick::SRGBColorspace 
img.add_profile "#{Rails.root.to_s}/lib/color_profiles/RGB.icc" 
img.write(url = "#{Rails.root.to_s}/tmp/#{self.id}_logo.png") 

image = File.open(url) 

IMGが、私は結果作成されたファイルをチェックすると、正しくRGB画像です。

追加情報: アップロードされた画像はすべて白黒の黒ですが、同じ画像を赤い背景でアップロードすると、最終的な画像は正しくRGB画像になります。

+0

すべてのチャネルの値は同じですか?それはすべての3つのチャネルは同じですか?もしそうなら、それはimagemagickのバージョンとファイルがどのように作成されたかによっても可能です。 ImageMagickのどのバージョンを使用していますか?アップロードされた画像はオリジナルのように見えますか?オリジナルに色が付いていると仮定すると、アップロードされたバージョンは同じように見えるか、グレーになります。 – fmw42

+0

こんにちは、私はImageMagick 6.7を使用しています。図7-10に示すように、アップロードされた画像は元の画像よりも明るく、たとえば、背景#242424(元の画像)はアップロードされた画像の#303030になります。ありがとう – marco

答えて

0

わかりません。あなたのイメージはカラーイメージかグレースケールのみのイメージですか?

IM 6.7.7.10は、ImageMagickが非線形グレーから線形グレーに戻って再び戻っていた時代でした。また、RGBとsRGBを入れ替えました。したがって、グレーが線形(非線形グレーより暗い)またはRGBとsRGBがスワップされたバージョンを持つことができます。次のいずれかを使用して非線形に戻すことができます(現時点では使用するものはありません)。もう一方は線形から非線形に変換されます。私はあなたの入力画像がグレースケールだったとない色を想定した場合、これらのいずれかを試してみてください。

convert input -colorspace RGB -colorspace gray result 

または

convert input -colorspace sRGB -colorspace gray result 

それはグレースケールが、唯一の色でない場合は、-colorspaceグレーをオフのままにこれらのコマンドで。

可能であれば、アップグレードをお勧めします。あなたは200以上の古いバージョンです。

P.S.あなたのプロフィールが問題を引き起こしている可能性もあります。私はRGB.iccプロファイルが何であるか分かりません。これは、Adobe RGBプロファイルかsRGBプロファイルかです。

Command Line ImageMagickを使用して問題を再現できますか?その場合は、使用したコマンドラインを投稿してください。申し訳ありませんがRubyやRMagickについてはわかりません。

P.S. 2明るい/暗い問題の他に、グレースケールイメージをカラーに変換しようとする場合は、出力をPNG24:name.pngとして指定する必要があります。これは、カラーピクセルを挿入せずにグレースケールイメージにcolorspace = RGBを報告させる唯一の方法です。

+0

hello @ fmw42画像をjpgからpngに変換すると、色空間をグレースケールからrgbに変更するのに役立ちましたが、アップロード後の色が変わり、変換が暗くなりました。ここでは[link](https://imgur.com/a/Q7i9w)を生成する。 RGBプロファイルについては、私は[this one](http://www.color.org/srgbprofiles.xalter)を使用しています。私が使用するimagemagickコマンドは次のとおりです:convert input.jpg -profile /path/to/sRGB.icc output.png – marco

+0

'@ marco'投稿した画像は両方ともPNGでした。あなたはJPGで始まったと言います。しかしJPGは透明性を認めていない。ただし、入力グレースケールPNGは部分的に透明です。透明性はどうでしたか?入力したPNGが間違った色空間を報告しています(私の新しい回答に記載されています)が、PNGチャンクはtruecoloralpha RGBAとして報告しています。したがって、JPGからPNGへの変換では、すでに色空間を変更して、何とか透明性を追加しました。元のJPGを投稿する必要があります。 – fmw42

0

グレースケールイメージのRGB PNGへの変換を報告する際、ImageMagick 6.9.9.27および7.0.7.15にバグがあるようです。 -verboseはグレースケールを報告していますが、文字列形式%[colorspace]はPNGタグと同様にsRGBを適切に報告しています。私はこのバグを報告しました。例:

convert logo: -colorspace gray logo.jpg 
convert logo.jpg PNG24:logo.png 
convert logo.png -format "%[colorspace]" info: 
sRGB 


identify -verbose logo.png 
... 
Colorspace: Gray 
... 
png:IHDR.color-type-orig: 2 
png:IHDR.color_type: 2 (Truecolor) 
関連する問題