来自GrayScale的Ruby + RMagick + base64图像+ RGB转换不起作用

时间:2017-12-16 18:58:45

标签: ruby-on-rails ruby imagemagick rmagick color-scheme

我将base64编码的图像上传到RoR应用程序。当我收到图像时,它有一个rgb颜色方案(正确),当我将文件写入要用paperclip gem上传的文件时,图像颜色方案从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图像:

identify -format "%[colorspace]" #{url}

配色方案是灰色。

其他信息: 上传的图像全黑,带白色文字,如果我上传红色背景的相同图像,则最终图像正确为RGB图像。

2 个答案:

答案 0 :(得分:1)

在报告将灰度图像转换为RGB PNG时,ImageMagick 6.9.9.27和7.0.7.15中似乎存在错误。识别-verbose报告灰度,但字符串格式%[colorspace]正确报告sRGB,PNG标记也是如此。我已经报告了这个错误。例如:

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)

答案 1 :(得分: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 grey。

如果可以,我会敦促你升级。你已经超过200个版本了。

P.S。您的个人资料也可能导致问题。我不知道RGB.icc配置文件是什么。这是Adobe RGB配置文件还是sRGB配置文件。

您可以使用命令行ImageMagick重现您的问题吗?如果是这样,请发布您使用的命令行。对不起,我不认识Ruby或RMagick。

P.S。 2除了较浅/较暗的问题,如果您尝试将灰度图像转换为颜色,则需要将输出指定为PNG24:name.png。这是强制灰​​度图像报告colorspace = RGB而不插入彩色像素的唯一方法。