2017-12-16 5 views
1

Ich lade Base64-kodierte Bilder in eine RoR-Anwendung hoch. Wenn ich das Bild erhalte, hat es ein RGB-Farbschema (korrekt), wenn ich das Bild auf Datei schreibe, um mit dem Büroklammer-Edelstein hochgeladen zu werden, ändert sich das Bildfarbschema von rgb zu Graustufen. HierRuby + RMagick + base64 Bild + RGB-Konvertierung von GrayScale funktioniert nicht

ist der Code:

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) 

das img ist richtig ein RGB-Bild, wenn ich die Folge erstellte Datei überprüfen:

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

das Farbschema ist Grau.

Zusätzliche Informationen: Das hochgeladene Bild ist schwarz mit weißem Text, wenn ich das gleiche Bild mit rotem Hintergrund hochladen, ist das endgültige Bild korrekt ein RGB-Bild.

+0

Haben alle Kanäle die gleichen Werte? Das sind alle 3 Kanäle gleich? Wenn ja, dann ist das je nach Version von imagemagick und wie die Datei erstellt wurde möglich. Welche Version von ImageMagick benutzt du? Sieht das hochgeladene Bild wie das Original aus? Wenn das Original farbig ist, sieht die hochgeladene Version gleich aus oder ist grau geworden. – fmw42

+0

Hallo, ich benutze ImageMagick 6.7.7-10, das hochgeladene Bild ist heller als das Original, zum Beispiel Hintergrund # 242424 (Originalbild) wird # 303030 auf dem hochgeladenen Bild. Danke – marco

Antwort

0

Ich verstehe nicht. Ist Ihr Bild ein Farbbild oder ein Graustufenbild?

IM 6.7.7.10 war während einer Zeit, in der ImageMagick von nichtlinearem Grau zu linearem Grau und wieder zurück wechselte. Und hatten auch RGB und sRGB getauscht. Sie können also eine Version haben, in der Grau linear war (dunkler als nicht-lineares Grau) oder RGB und sRGB vertauscht wurden. Sie können zurück zu nicht-linear konvertieren, indem Sie eine der folgenden Methoden verwenden (ich weiß nicht, welche Sie zu diesem Zeitpunkt verwenden sollen). Der andere wird von linear zu nichtlinear konvertieren. Wenn ich Ihre Eingangsbild war Graustufen- und Farbe nicht annehmen, dann versuchen Sie eine der folgenden Optionen:

convert input -colorspace RGB -colorspace gray result 

oder

convert input -colorspace sRGB -colorspace gray result 

Wenn es nicht Graustufen, sondern nur Farbe, dann die -colorspace grau wegzulassen in diesen Befehlen.

Ich würde Sie auffordern, zu aktualisieren, wenn Sie können. Du bist weit über 200 Versionen alt.

P.S. Es ist auch möglich, dass dein Profil ein Problem verursacht. Ich weiß nicht, was das RGB.icc-Profil ist. Ist das ein Adobe RGB-Profil oder ein sRGB-Profil?

Können Sie Ihr Problem mit Command Line ImageMagick reproduzieren? Ist dies der Fall, geben Sie die von Ihnen verwendete Befehlszeile ein. Tut mir leid, ich kenne Ruby oder RMagick nicht.

P.S. 2 Wenn Sie versuchen, ein Graustufenbild in Farbe zu konvertieren, müssen Sie neben dem helleren/dunkleren Problem die Ausgabe als PNG24: name.png angeben. Nur so kann ein Graustufenbild Farbraum = RGB melden, ohne Farbpixel einzufügen.

+0

hallo @ fmw42, das Bild von jpg in png umwandeln half mir tatsächlich den Farbraum von Graustufen in rgb zu ändern, aber immer noch die Farbe nach dem Upload und die Konvertierung ist dunkler, hier ist der [link] (https://imgur.com (a/Q7i9w) der Bilder. Was das RGB-Profil betrifft, verwende ich [dieses] (http://www.color.org/srgbprofiles.xalter). Der imagemagick-Befehl, den ich benutze, ist folgender: convert input.jpg -profile /path/to/sRGB.icc output.png – marco

+0

'@ marco' Die von Ihnen geposteten Bilder waren beide PNG. Du sagst, du hast mit JPG angefangen. Aber JPG erlaubt keine Transparenz. Ihre Eingabe Graustufen PNG hat jedoch teilweise Transparenz. Wie hat es die Transparenz erhalten? Ihre Eingabe-PNG meldet den falschen Farbraum (wie in meiner neuen Antwort beschrieben), aber die PNG-Chunks melden es als TrueColoralpha RGBA. Sie haben also bei der Konvertierung von JPG nach PNG den Farbraum bereits verändert und irgendwie Transparenz hinzugefügt. Vielleicht solltest du dein original JPG posten. – fmw42

0

Es scheint einen Fehler in ImageMagick 6.9.9.27 und 7.0.7.15 zu geben, wenn die Konvertierung eines Graustufenbildes in RGB PNG gemeldet wird. Identifizieren -verbose meldet Graustufen, aber das Zeichenfolgenformat% [Farbraum] meldet sRGB ordnungsgemäß, genau wie die PNG-Tags. Ich habe diesen Fehler gemeldet. Zum Beispiel:

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)