はじめに
前回はRMagickを用いて画像のリサイズの仕方を紹介しました。今回は、
なお、
require 'rubygems'
require 'rmagick'
height = 160
width = 160
scale = 0.5
動作確認環境 | ruby 1. ImageMagick 6. rmagick 2. |
---|
サンプル画像は以下を用います。
![](/assets/images/dev/serial/01/ruby/0027/original.gif)
アニメGIFファイルの読み込み
RMagickでアニメGIFファイルの読み込みを行う場合は、
なお、
ilist = Magick::ImageList.new('original.gif')
アニメGIFの構成
アニメGIF、
たとえば、
![図2-0 original-0.png 図2-0 original-0.png](/assets/images/dev/serial/01/ruby/0027/thumb/TH75_original-0.png)
![図2-1 original-1.png 図2-1 original-1.png](/assets/images/dev/serial/01/ruby/0027/thumb/TH75_original-1.png)
![図2-2 original-2.png 図2-2 original-2.png](/assets/images/dev/serial/01/ruby/0027/thumb/TH75_original-2.png)
![図2-3 original-3.png 図2-3 original-3.png](/assets/images/dev/serial/01/ruby/0027/thumb/TH75_original-3.png)
![図2-4 original-4.png 図2-4 original-4.png](/assets/images/dev/serial/01/ruby/0027/thumb/TH75_original-4.png)
![図2-5 original-5.png 図2-5 original-5.png](/assets/images/dev/serial/01/ruby/0027/thumb/TH75_original-5.png)
ちなみに、
ilist = Magick::ImageList.new('original.gif')
ilist.write('original.png')
アニメGIFのリサイズ
アニメGIFをリサイズする場合に気をつけなければいけない点がいくつかあります。サンプルとする画像によっては問題にならないケースもありますが、
普通にリサイズしてみる
前回紹介したresizeメソッドを使ってそのままリサイズしてみます。
ilist = Magick::ImageList.new('original.gif')
ilist.resize!(scale)
ilist.write('just_resize.gif')
すると、
![](/assets/images/dev/serial/01/ruby/0027/just_resize.gif)
フレーム毎にリサイズする
次に、
ilist = Magick::ImageList.new('original.gif')
ilist.each{|frame| frame.resize!(0.5)}
ilist.write('frame_resize.gif')
これで全フレームをリサイズすることはできましたが、
![](/assets/images/dev/serial/01/ruby/0027/frame_resize.gif)
画像を展開してからリサイズする
そこで、
ilist = Magick::ImageList.new('original.gif')
ilist = ilist.coalesce
ilist.each{|frame| frame.resize!(0.5)}
ilist.write('coal_resize.gif')
これで綺麗なリサイズ画像を得ることはできました。しかしファイルサイズを見ると、
![](/assets/images/dev/serial/01/ruby/0027/coal_resize.gif)
リサイズ後最適化する
そのため、
引き数は適用する仕組みの指定なのですが、
ilist = Magick::ImageList.new('original.gif')
ilist = ilist.coalesce
ilist.each{|frame| frame.resize!(scale)}
ilist = ilist.optimize_layers(Magick::OptimizeLayer)
ilist.write('opt_resize.gif')
![](/assets/images/dev/serial/01/ruby/0027/opt_resize.gif)
この最適化により、
ただ、
ilist = Magick::ImageList.new('original.gif')
ilist = ilist.coalesce
ilist.each{|frame| frame.resize!(scale)}
ilist = ilist.optimize_layers(Magick::OptimizeTransLayer)
ilist = ilist.deconstruct
ilist.write('opt_resize2.gif')
ここでは、
![](/assets/images/dev/serial/01/ruby/0027/opt_resize2.gif)
指定サイズにリサイズ
最後に前回紹介した手法を交えて、
ポイントしては、
ilist = Magick::ImageList.new('original.gif')
ilist = ilist.first.change_geometry("#{height}x#{height}") do |cols,rows,img|
new_il = Magick::ImageList.new
ilist.each{|frame|
new_frame = frame.resize(cols,rows)
new_frame = new_frame.extent(width,height,-(width-cols)/2,-(height-rows)/2)
new_il << new_frame
}
new_il
end
ilist = ilist.optimize_layers(Magick::OptimizeLayer)
ilist.write('resize_extent.gif')
![](/assets/images/dev/serial/01/ruby/0027/resize_extent.gif)
まとめ
今回はRMagickでのアニメGIFの取扱いについて紹介しました。アニメGIFをリサイズ
- フレーム毎にリサイズする
- 画像を差分から展開してからリサイズする
- リサイズ後に最適化を施す
これはRMagickを利用しない場合でも同じです。