2014-02-20 71 views
4

我正在嘗試將GIF圖像調整爲不同的大小。我在Ruby中使用RMagick庫。但是對於一些GIF圖像來說,即使在縮小GIF的時候,文件大小也會增加。我正在調整圖像圖像的寬高比。這是我的代碼。用ruby調整動畫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(和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 } 
+1

使用CompareClearLayer,動畫不起作用,但我使用了OptimizeLayer,它對我很有用。 –

+0

@Narenda Rajput:我在測試時一定很困惑,我調整了答案,謝謝。它的工作原理和文件大小較小,但結果是我的設置有點令人失望。從邏輯上講,它應該有可能獲得更小的文件大小,但我不確定還有什麼應該改變以實現該目標。 –

+0

@Narenda Rajput:刪除'.remap',它會巧妙地改變顏色,並且無法優化幀。 –