我将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图像。
答案 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而不插入彩色像素的唯一方法。