Переопределить цвет прозрачности при преобразовании прозрачного PNG в JPG - PullRequest
4 голосов
/ 31 мая 2010

Я использую Dragonfly для создания миниатюр изображений в приложении 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 раз больше, а сайт уже достаточно загружен.

Ответы [ 2 ]

10 голосов
/ 01 сентября 2010

Вы можете создать 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

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

Надеюсь, это поможет! Хендрик

0 голосов
/ 03 июня 2010

Если у кого-то еще есть такая же проблема, я не смог понять, как это сделать через RMagick Я сейчас написал решение с использованием командной строки ImageMagick (convert):

  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
...