画像をクリッピング
たとえば100x100の画像に10x10のマージンを用意するにはこんな感じ。
draw.define_clip_path 'clip' do draw.path "M 10 10 L 10 90 L 90 90 L 10 90 z" end draw.push draw.clip_path 'clip' # draw使っていろいろ描画 draw.pop
パス指定のフォーマットはSVGのパスと同じらしい。
名前つきのパスを定義して、パス名でクリップ領域を指定しないとだめらしい。
あと、pushとpopがなぜか必要らしい。
なんかごちゃごちゃするのでMagick::Drawに次のようなメソッドを追加した。
class Magick::Draw def within_clip(svg_path, &block) clip_name = "clip#{Time.now.to_i}" define_clip_path(clip_name){path svg_path} push clip_path clip_name block.call pop end end
draw.within_clip("M 10 10 L 10 90 L 90 90 L 10 90 z") do # 描画 end
問題なく動いてるっぽい。