Override colore di trasparenza durante la conversione PNG trasparenti in JPG
-
05-10-2019 - |
Domanda
Dragonfly per generare immagini di anteprima in un'applicazione Rails.
Sono al servizio di tutte le immagini di immagine come JPG. Ora il cliente è il caricamento dei file PNG trasparenti, come questo:
http://www.ibanez.co.jp/products /images/eg2010/ART120_TRF_12_02.png
Dragonfly utilizza RMagick per convertire queste immagini in JPG. Il problema è che converte le immagini PNG a JPG con uno sfondo nero, e il design del mio sito richiede uno sfondo bianco. Ho cercato di ignorare in questo modo:
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
Ma le immagini JPG prodotte contengono ancora uno sfondo nero. Qualcuno sa come battere RMagick ad utilizzare uno sfondo bianco quando si converte lo strato trasparente?
Lo so ho potuto solo servire come PNG, ma poi le immagini sono 10 volte più grande, e il sito è già piuttosto pesante di larghezza di banda.
Soluzione
È possibile creare un ImageList per essere in grado di mettere un'immagine bianca con le stesse dimensioni dell'immagine originale sotto l'immagine trasparente. Se si appiattisce l'ImageList verso il basso per l'immagine, si ottiene un'immagine con il colore trasparente sostituito da qualunque sia la seconda immagine conteneva.
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
Questo funziona per me, ma potrebbe essere ottimizzato ulteriormente, credo.
Speranza che aiuta! Hendrik
Altri suggerimenti
Se qualcun altro ha lo stesso problema, non ero in grado di capire come fare questo attraverso RMagick. Ora ho scritto una soluzione che utilizza ImageMagick riga di comando (file):
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