gpt4 book ai didi

ruby - 使用 ruby​​ 调整动画 GIF 图像的大小?

转载 作者:数据小太阳 更新时间:2023-10-29 07:27:02 27 4
gpt4 key购买 nike

我正在尝试将 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 绑定(bind))包含一个函数,用于将 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 }

关于ruby - 使用 ruby​​ 调整动画 GIF 图像的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21910837/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com