Переопределить цвет прозрачности при преобразовании прозрачного PNG в JPG

StackOverflow https://stackoverflow.com/questions/2942210

  •  05-10-2019
  •  | 
  •  

Вопрос

я использую Стрекоза Для генерации миниатюрных изображений в приложении Rails.

Я обслуживаю всех изображений изображения как JPG. Теперь клиент загружает прозрачные файлы PNG, как этот:

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

Dragonfly использует RMAGICK для преобразования этих изображений в JPG. Проблема в том, что она преобразует изображения PNG к JPG с черным фоном, и дизайн моего сайта требует белого фона. Я пытался переопределить это так:

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

Но произведенные изображения JPG по-прежнему содержат черный фон. Кто-нибудь знает, как победить RMAGICK, используя белый фон при преобразовании прозрачного слоя?

Я знаю, что я мог бы просто служить PNG, но затем изображения в 10 раз большие, а сайт уже довольно много пропускной способности.

Это было полезно?

Решение

Вы можете создать ImageList, чтобы иметь возможность положить белое изображение с тем же размером, что и ваше исходное изображение под прозрачным изображением. Если вы сплющите ImageList вниз на изображение, вы получаете изображение с прозрачным цветом, замененным тем, каким бы ни находим второе изображение.

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

Это работает для меня, но можно оптимизировать дальше, я думаю.

Надеюсь, это поможет! Hendrik

Другие советы

Если у кого-то еще есть та же проблема, я не смог выяснить, как это сделать через Rmagick. Теперь я написал решение, используя командную строку ImageMagick (конвертировать):

  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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top