2014-02-20 6 views
4

Я пытаюсь изменить размер изображения GIF для разных размеров. Я использую библиотеку RMagick в рубине. Но, похоже, для некоторых gif-изображений размер файла увеличивается даже тогда, когда я уменьшаю GIF. И я изменяю изображение изображения в том же соотношении сторон. Вот мой код.Изменение размера анимированных изображений GIF с помощью рубина?

require 'rmagick' 
path = "/path/to/file/" 
s_image = "image.gif" # image is 320*320 
t_image = "t.gif" 
file_name = path+s_image 
file = File.new(file_name) 
list = Magick::ImageList.new.from_blob file.read 
list = list.coalesce.remap 
list.each do |x| 
    x.resize_to_fill!(256,256) 
end 
File.open("#{path+t_image}", 'wb') { |f| f.write list.to_blob } 

Что мне не хватает?

+0

Не могли бы вы привести пример изображения, которое становится больше. Лучше всего предположить, что вы начинаете с низкого количества цветов, но размер будет создавать объединенные цвета для некоторых пикселей, которые либо будут затухают в новом изображении (что уменьшит эффективность RLE), либо потребует большей палитры от оригинала. –

+0

Примеры файлов Исходный файл - https://dl.dropboxusercontent.com/u/47897449/s_image.gif (602 x 429) Целевой файл - https://dl.dropboxusercontent.com/u/47897449/ t_image.gif (301 x 214) Извините, но я не являюсь экспертом в этом. Но если вы могли бы указать на что-то или, может быть, подробно изложить, что я могу сделать. –

+1

Это не имеет никакого отношения к Ruby –

ответ

7

Образ, с которым вы связаны, состоит из 35 кадров. Он также был оптимизирован, так что после первого кадра каждый кадр содержит только пиксели, которые отличаются друг от друга. Большинство пикселей прозрачны, потому что очень мало движется. Это обычная ситуация с анимированными gif - они могут быть сделаны относительно эффективными (с точки зрения размера файла), если не слишком много изменений или движения камеры.

Кроме того, каждый размер кадра является минимальным прямоугольником, необходимым для хранения всех изменяющихся пикселей, поэтому он варьируется от кадра к кадру.

Это ясно видно, если вы загрузите исходное изображение, например. GIMP и проверьте отдельные слои.

Если вы сделаете это с преобразованным изображением, вы также увидите, что ваш код отображает каждый кадр в полном объеме, чтобы точно изменить размер. В качестве побочного эффекта это увеличивает размер файла. Уменьшение изображения x, y до половины должно означать, что размер вашего выходного файла составляет примерно 1/4 от оригинала. Тем не менее, поворот каждого кадра с разницы в несколько пикселей до полного кадра значительно увеличивает размер. Поскольку имеется 35 кадров, это больше, чем компенсирует меньшую ширину и высоту.

К счастью, ImageMagick (и привязки Rmagick в Ruby) включает в себя функцию для повторной оптимизации GIF назад к слоям с только различиями, хранящимися как видимые пиксели. Вам нужно добавить вызов этого метода optimize_layers, чтобы ваш код имел более низкий размер файла. Кроме того, для получения максимального размера файла вам необходимо прекратить использование .remap, который изменяет значения пикселей, достаточные для того, чтобы оптимизатор не работал.

require 'rmagick' 
path = "/path/to/file/" 
s_image = "s_image.gif" # image is 320*320 
t_image = "t_image.gif" 
file_name = path+s_image 
file = File.new(file_name) 
list = Magick::ImageList.new.from_blob file.read 

# This renders out each GIF frame in full, prior to re-sizing 
# Note I have removed the .remap because it alters pixel values 
# between frames, making it hard to optimise 
list = list.coalesce 

list.each do |x| 
    x.resize_to_fill!(256,256) 
end 

# Re-optimize the GIF frames 
list = list.optimize_layers(Magick::OptimizeLayer) 

File.open("#{path+t_image}", 'wb') { |f| f.write list.to_blob } 
+1

Используя CompareClearLayer, анимация не работала, но я использовал OptimizeLayer, и это сработало для меня. –

+0

@Narenda Rajput: Должно быть, я запутался во время тестирования, я скорректировал ответ, спасибо. Он работает, и размер файла меньше, но результат немного разочаровывает мою настройку.Логично, что у вас должно быть намного меньше размера файла, но я не уверен, что еще нужно изменить для достижения этого. –

+0

@Narenda Rajput: удалить «.remap», он изменяет цвет тонко и делает невозможным оптимизацию кадров , –

Смежные вопросы