Remplacer la couleur de transparence lors de la conversion PNG transparent en JPG
-
05-10-2019 - |
Question
J'utilise Dragonfly pour générer des images miniatures dans une application Rails.
Je sers toutes les images d'image JPG de. Maintenant, le client est le téléchargement de fichiers PNG transparents, comme celui-ci:
http://www.ibanez.co.jp/products /images/eg2010/ART120_TRF_12_02.png
Dragonfly utilise RMagick pour convertir ces images en JPG. Le problème est qu'il convertit les images PNG au format JPG avec un fond noir, et la conception de mon site a besoin d'un fond blanc. J'ai essayé de passer outre comme ceci:
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
Mais les produits images JPG contiennent encore un fond noir. Est-ce que quelqu'un sait comment battre RMagick en utilisant un fond blanc lors de la conversion de la couche transparente?
Je sais que je pouvais servir PNG, mais les images sont 10 fois plus grande, et le site est déjà assez lourd de la bande passante.
La solution
Vous pouvez créer un ImageList pour pouvoir mettre une image blanche avec la même taille que l'image d'origine sous l'image transparente. Si vous aplatissez ImageList vers le bas à une image, vous obtenez une image avec la couleur transparente remplacée par ce que la seconde image contenue.
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
Cela fonctionne pour moi, mais pourrait être optimisé plus loin, je suppose.
L'espoir qui aide! Hendrik
Autres conseils
Si quelqu'un d'autre a le même problème, je n'étais pas en mesure de comprendre comment faire cela par RMagick. J'ai maintenant écrit une solution en ligne de commande ImageMagick (Compressé):
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