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.

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top