Außer Kraft setzt Transparenz Farbe, wenn transparenten PNG zu JPG konvertieren
-
05-10-2019 - |
Frage
Ich bin mit Libelle Miniaturbild in einer Rails-Anwendung zu generieren.
Ich diene alle Bilder Bilder als JPG ist. Jetzt ist der Client lädt transparente PNG-Dateien, wie diese:
http://www.ibanez.co.jp/products /images/eg2010/ART120_TRF_12_02.png
Dragonfly verwendet RMagick diese Bilder in JPG-Dateien zu konvertieren. Das Problem ist, dass es die PNG-Bilder in JPG-Dateien mit einem schwarzen Hintergrund umwandelt, und meine Website-Design erfordert einen weißen Hintergrund. Ich habe versucht, es so außer Kraft zu setzen:
encoded_image = Magick::Image.from_blob(image.data).first
if encoded_image.format.downcase == format
image # do nothing
else
encoded_image.format = format
encoded_image.background_color = "white"
encoded_image.transparent_color = "white"
encoded_image.to_blob
end
Aber die erzeugten JPG-Bilder noch einen schwarzen Hintergrund enthalten. Wer weiß, wie RMagick in mit einem weißen Hintergrund zu schlagen, wenn die transparente Schicht Umwandlung?
Ich weiß, ich könnte genauso PNG dienen, aber dann sind die Bilder 10 mal so groß ist, und die Seite ist schon ziemlich Bandbreite schwer.
Lösung
Sie können einen Abbildungsliste erstellen zu können, ein weißes Bild mit der gleichen Größe wie das Originalbild unter dem transparenten Bild setzen. Wenn Sie die Abbildungsliste nach unten auf ein Bild glätten, Sie ein Bild mit der transparenten Farbe ersetzt bekommen, was auch immer das zweite Bild enthalten ist.
img_list = Magick::ImageList.new
img_list.read("my_png_file.png")
img_list.new_image(img_list.first.columns, img_list.first.rows) { self.background_color = "white" } # Create new "layer" with white background and size of original image
image = img_list.reverse.flatten_images
für mich Dies funktioniert aber weiter optimiert werden kann, denke ich.
Ich hoffe, das hilft! Hendrik
Andere Tipps
Wenn jemand anderes das gleiche Problem hat, war ich nicht in der Lage, herauszufinden, wie dies durch RMagick zu tun. Ich habe jetzt eine Lösung mit der Befehlszeile ImageMagick (convert) geschrieben:
if encoded_image.format.downcase == "png"
temp_file = Tempfile.new(image.object_id)
encoded_image.write("png:" + temp_file.path)
encoded_image.destroy!
system "convert -flatten \"#{temp_file.path}\" \"jpg:#{temp_file.path}\""
encoded_image = Magick::Image.read(temp_file.path)[0]
temp_file.delete
else