【发布时间】:2016-05-25 15:39:05
【问题描述】:
我正在使用 Ruby 从多个源图像生成动画 GIF 文件。我需要最大化吞吐量/最小化创建每个 GIF 所花费的时间。我更愿意将源图像保存在内存中(可能是 Memcached),而不是每次需要它们时从磁盘中读取它们。我一直在反引号中使用 convert 直接从 Ruby 执行 imagemagick 命令,例如
`convert -delay #{delay} -page #{w}x#{h}+0+0 src01.gif... etc`
我比 RMagick 更喜欢这个,因为我找到了更多示例,我可以直接参考 ImageMagick 文档。似乎传递给convert 命令的图像需要是磁盘上图像的路径。此外,convert 命令的输出似乎是一个文件路径,因此生成的图像将由 ImageMagick 写入磁盘,我需要使用 Ruby 从磁盘读取它以访问生成的图像数据。似乎我正在让 ImageMagick 每次都从光盘读取源图像并将生成的 GIF 写入光盘。我认为这可能是一个瓶颈并且没有必要,因为我不需要持久化生成的图像,我只需要暂时在 Ruby 中访问它们的图像数据。
我注意到 RMagick 方法可以将Magick::Images 作为参数而不是文件路径。在这种情况下,我可以将源图像保存在内存中。此外,RMagick 将生成的图像作为数据返回给 Ruby,这是我需要的,我不需要将其写入光盘。
我正在考虑使用 RMagick 而不是
`convert...`
减少磁盘活动。
所以问题 1:这有意义吗?既然 RMagick 可能包装了 ImageMagick,那么 RMagick 是否真的在后台读取和写入磁盘,或者它是否有某种方式在没有磁盘活动的情况下使用 ImageMagick?
还有问题 2:有没有什么方法可以在没有磁盘活动的情况下从 ImageMagick 的转换命令中获取图像数据?
希望这是有道理的。只是想解决这个问题,如果我不清楚,请道歉。
【问题讨论】:
-
您可以考虑制作一个小型 RAMdisk 作为一种选择。
-
当然,您也可以在 Ruby 中累积/生成图像并从序列中创建动画 GIF...不确定 Ruby 语法但在 PHP 中,您可以为每个帧直到你有完整的序列,然后你做
setImageDispose()和writeImages("animated.gif",true)
标签: ruby imagemagick rmagick