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.

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top