您鏈接的圖像由35幀組成。它也被優化了,所以在第一幀之後,每一幀只包含不同的像素。大部分像素都是透明的,因爲移動很少。這是動畫gif的常見情況 - 如果沒有太多更改或相機移動,它們可以變得相對高效(根據文件大小)。另外,每個幀大小是包含所有變化像素所必需的最小矩形,因此它在幀到幀之間不同。
如果您在原始圖像中加載了原始圖像,您可以清楚地看到這一點。 GIMP,並檢查單個圖層。
如果您使用轉換後的圖像做到這一點,還可以看到您的代碼全部渲染出每一幀,以便準確重新調整大小。作爲此的副作用,它增加了文件大小。將圖像x,y縮小爲一半意味着您的輸出文件大小約爲原來的1/4。但是,將每個幀從幾個像素差異轉換爲全幀將顯着增大尺寸。由於有35個框架,這不僅彌補了較小的寬度和高度。
幸運的是,ImageMagick(和Ruby中的Rmagick綁定)包含一個函數,用於將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 }
你能舉一個越來越大的例子嗎?我最好的猜測是,你的顏色計數較低,但重新調整大小會爲某些像素創建合併顏色,這些顏色會在新圖像中變爲抖動(降低RLE效率)或需要較大的原始調色板。 –
以下是示例文件 源文件 - https://dl.dropboxusercontent.com/u/47897449/s_image.gif(602 x 429) 目標文件 - https://dl.dropboxusercontent.com/u/47897449/ t_image.gif(301 x 214) 對不起,但我不是這方面的專家。但是,如果您能指出某些細節或詳細闡述細節,我可以做些什麼。 –
它與Ruby無關 –