RMagickでGIFアニメを加工しているときにハマった

RMagickを使ってちょっと大きめなGIFアニメをイロイロと加工してます。んで、その時にハマったのをメモ。

各フレームにそれぞれ別の待ち時間を設定してGIFアニメを作ってしまったんですが、それぞれのフレームの待ち時間を統一しないと他のGIFアニメと合成したりとかが難しい。
そんな分けで、各フレームの待ち時間の最大公約数で待ち時間を統一し、その時間より大きかった待ち時間のフレームは分割するして対応するってrubyスクリプトを書きました。下記参照。

require 'rubygems'
require 'RMagick'
include Magick
imgs = ImageList.new
dodai = ImageList.new("do-dai.gif")
dodai.each do |img|
  temp = img.dup
  1.step(img.delay, 10) do |n|
    temp.delay = 10
    imgs << temp
  end
end
imgs.write("do-dai1.gif")

で、これを実行したわけですが、うまく動きません。最後のwriteのところでなぜかフリーズします。原因は今でもよく分かりません。ただ下記のように変更したら何故か正常に動きました。

dodai.each do |img|
  1.step(img.delay, 10) do |n|
    temp = img.dup               # <= ここ重要
    temp.delay = 10
    imgs << temp
  end
end
imgs.write("do-dai1.gif")

どうも、一度 ImageList に追加した Image のインスタンスを再度追加するとダメになるようです。追加する際にインスタンスに何らかの変更が加えられて、それが原因になってるんでしょうか。……謎です。とりあえず、毎回 Image#dupインスタンスを新たに作成してから追加するように変更しました。これで解決したので謎は残りますけど良しとしますが、将来の自分と同じところにハマっている人の為に記録しときます。