Anular color de transparencia al convertir PNG transparente a JPG
-
05-10-2019 - |
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.
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