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 でインスタンスを新たに作成してから追加するように変更しました。これで解決したので謎は残りますけど良しとしますが、将来の自分と同じところにハマっている人の為に記録しときます。