Переопределить цвет прозрачности при преобразовании прозрачного PNG в JPG
-
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