Pregunta

Estoy usando libélula para generar imágenes en miniatura en una aplicación Rails.

Estoy sirviendo todas las imágenes y fotos en formato JPG de. Ahora el cliente es subir archivos PNG transparentes, como éste:

http://www.ibanez.co.jp/products /images/eg2010/ART120_TRF_12_02.png

libélula utiliza RMagick para convertir estas imágenes a JPG. El problema es que convierte las imágenes PNG a JPG con un fondo negro, y el diseño de mi sitio requiere un fondo blanco. He tratado de anularlo como esto:

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

Pero las imágenes JPG producidos todavía contienen un fondo negro. ¿Alguien sabe cómo derrotar a RMagick en el uso de un fondo blanco al convertir la capa transparente?

Sé que sólo pudiera servir como PNG, pero luego las imágenes son 10 veces más grande, y el sitio ya es bastante pesada ancho de banda.

¿Fue útil?

Solución

Se puede crear un ImageList a ser capaz de poner una imagen en blanco con el mismo tamaño que la imagen original debajo de la imagen transparente. Si acopla ImageList a una imagen, se obtiene una imagen con el color transparente reemplazado por cualquiera que sea la segunda imagen contenida.

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

Esto funciona para mí, pero podría optimizarse aún más, supongo.

Espero que ayude! Hendrik

Otros consejos

Si alguien más tiene el mismo problema, no fue capaz de encontrar la manera de hacer esto a través de RMagick. Ahora he escrito una solución usando ImageMagick línea de comandos (convertido):

  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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top