我正在尝试将 GIF 图像调整为不同的尺寸。我在 ruby 中使用 RMagick 库。但对于某些 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 }
我缺少什么?
您链接的图像由 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 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)