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

2024-05-18

我正在尝试将 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(使用前将#替换为@)

使用 ruby​​ 调整动画 GIF 图像的大小? 的相关文章

  • 测试 Ruby 字符串或符号的字符串相等(而不是对象相等)的最简洁方法?

    我总是这样做来测试 Ruby 中的字符串相等性 if mystring eql yourstring puts same else puts different end 这是在不测试对象相等性的情况下执行此操作的正确方法吗 我正在寻找最简洁
  • Rails Partial (Rails 3, HAML) 任意慢

    我使用的是 Rails 3 0 1 HAML 0 3 22 和 Mongrel 1 1 5 MongoMapper 不是 AR 我正在渲染一个列表 每个列表项都是它自己的部分 每次页面渲染其中一个列表项部分时 渲染时间都会延长近 100 倍
  • 可以在哈希每个循环中访问索引吗?

    我可能遗漏了一些明显的东西 但是有没有办法访问哈希每个循环内迭代的索引 计数 hash three gt one four gt two one gt three hash each key value any way to know wh
  • Ruby 的 OpenSSL::Random 种子是否足够?

    我对 Ruby 知之甚少 所以如果答案很明显 请原谅我 我注意到在http www ruby doc org stdlib 1 9 3 libdoc securerandom rdoc SecureRandom html http www
  • Ruby 代码到 JAR

    我希望能够将 ruby 程序编译为 java JAR 程序 我研究过 JRuby 看到了几个能够 eval ruby 代码的 Java 应用程序示例 但是是否有更优雅的解决方案允许简单地用 ruby 编写所有内容 然后将其直接编译为 JAR
  • 标记(lex?parse?)正则表达式

    使用 Ruby 我想获取一个 Regexp 对象 或表示有效正则表达式的字符串 您的选择 并将其标记化 以便我可以操作某些部分 具体来说 我想采用这样的正则表达式 字符串 regex var w parts foo bar 并创建一个替换字
  • 在 Rails 4 中渲染部分/rake 任务/后台作业/模型中的视图

    我读过很多关于在 rake 任务 后台作业 模型中渲染 Rails 部分和视图的内容 我在 Stackoverflow 和网络上找到的绝大多数内容都描述了在 Rails 3 中工作的方法 但它们似乎已经过时了 而且我没有让它们工作 即使花了
  • 如何让 Sinatra 通过 HTTPS/SSL 工作?

    正如标题所示 谷歌没有提供任何与此相关的有用信息 如何为 Sinatra 应用程序设置和配置 HTTPS SSL 如何创建 HTTPS 路由 我以前从未在我的应用程序中使用过 HTTPS 也没有调整 Rack 其他内容的经验 所以我很欣赏详
  • Ruby on Rails 最酷的功能是什么,为什么选择它? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在我问这个问题之前 我浏览了 SO 上 Ruby on Rails 的搜索结果 找不到太多 但以下 在此页面上找到 https stackove
  • 如何使用 Ruby 2.7.0 修复 Rails 的警告消息

    有没有人解决这个问题Ruby 2 7 0 I used rbenv并安装了 Ruby v2 7 0 然后使用创建了一个 Rails 项目Rails v6 0 2 1 目前 通过运行之一 rails s rails s u puma rail
  • 在 ruby​​ 中读/写受密码保护和加密的文件

    我想加密一个 ruby 程序将从中加载数据的文件 此外 我需要程序在启动时提示输入密码 该密码将用于解密文件 换句话说 该文件需要加密地驻留在计算机上 只有拥有密码的用户才能运行该应用程序 我已经开始研究 openpgp 但据我了解 这仍然
  • 使用 YAML.load 解析 json 安全吗?

    我使用的是红宝石2 1 0 我有一个 json 文件 例如 测试 json item apple 1 banana 2 使用 YAML load 加载此文件是否安全 YAML load File read test json 我正在尝试加载
  • Java - 调整图像大小而不损失质量

    我有 10 000 张照片需要调整大小 因此我有一个 Java 程序来执行此操作 不幸的是 图像的质量损失很大 而且我无法访问未压缩的图像 import java awt Graphics import java awt AlphaComp
  • 带有附加参数的redirect_to

    我是一个菜鸟 redirect to users url notice Succeed p p 然后我添加一个message它失败了 redirect to users url notice Succeed message test p p
  • 什么是 - 获取的是一个目录 - 错误消息

    我收到这个奇怪的错误 Users gideon Documents ca ruby rubytactoe lib player rb 13 in gets Is a directory spec Errno EISDIR 玩家规格 rb r
  • 我需要什么库才能在 Java 中访问这个 com.sun.image.codec.jpeg?

    我正在用java创建一个图像水印程序 并导入了以下内容 import com sun image codec jpeg JPEGCodec import com sun image codec jpeg JPEGEncodeParam im
  • 解决相关代码的低 FPS 问题以计算图像中的偏移

    我正在尝试使用相关性来跟踪对象 我在较大的图像中逐帧找到较小的补丁 为此 我发现补丁中的变化 并且相关性最大的地方 用新补丁更新补丁 我的代码是 cv Mat im float 2 imagePart out cv Mat im float
  • class_eval、class_exec、module_eval 和 module_exec 之间有什么区别?

    我正在读Module文档 但似乎无法理解它们的差异以及应该在哪里使用 怎么样eval不同于exec 我将回答比你的问题更多的内容 包括instance eval exec 在你的问题中 所有变体 instance module class
  • 在 Mac OS X 10.6.8 中手动编译 Ruby 时,GEM 在哪里?

    我在 Snow Leopard 上手动构建了 Ruby 1 9 2 现在我找不到我的旧 GEM 文件了 我猜他们现在正走在不同的道路上 所以我有三个问题 什么是 旧 宝石路径 在哪里gem install sinatra把西纳特拉宝石 当我
  • rspec 中的模拟方法链

    有一系列方法可以获得user目的 我试图模拟以下内容以返回user in my Factory Girl current user AuthorizeApiRequest call request headers result 我可以模拟该

随机推荐