画像をクリッピング

たとえば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

問題なく動いてるっぽい。