differenceメソッド
# 画像読み込み
image1 = Magick::Image.read('http://example.com/image1.jpg')[0]
image2 = Magick::Image.read('http://example.com/image2.jpg')[0]
p image1.difference(image2)
# => [0.0, 0.0, 0.0]
# 同じ画像だと0
参考: http://genius.hateblo.jp/entry/2016/02/12/131823
compositeメソッド
# 画像読み込み
image1 = Magick::Image.read('http://example.com/image1.jpg')[0]
image2 = Magick::Image.read('http://example.com/image2.jpg')[0]
p image1.composite(image2, 0, 0, Magick::DifferenceCompositeOp)
# => 0
# 同じ画像だと0
うまくいかないとき
no decode delegate for this image format
Magick::Image.read に画像URLを指定すると次のようなエラーが出るときがあります。
Magick::ImageMagickError: no decode delegate for this image format
これは指定された画像のフォーマットは扱えないというエラーです。(サンプルの場合だとjpgが扱えないということ)下記のページの通り、ライブラリをインストールすれば解決するはずなんですが私の場合はこのエラーが消えず。。
http://dqn.sakusakutto.jp/2013/10/no_decode_delegate_for_this_image_format.html
同じように画像を読み込めない方はMagick::Image.from_blobを使ってみてください。
私はこれで画像を読み込むことができました。
Magick::Image.from_blob(open('http://example.com/image1.jpg').read)
参考: http://tech.itandi.co.jp/2016/04/image_diff_with_imagemagick/
違う画像なのに差分が0になる
differenceで差分を取得すると全く違う画像なのに差分が0になってしまうということがありました。
そういう時はcompositeを使ってみましょう。
# 画像読み込み
image1 = Magick::Image.from_blob(open('http://example.com/image1.jpg').read).first
image2 = Magick::Image.from_blob(open('http://example.com/image2.jpg').read).first
p image1.composite(image2, 0, 0, Magick::DifferenceCompositeOp)
若干differenceで取得した時の値とはズレがありますが許容できる範囲だと思います。
終わりに
画像の差分を取得したかっただけなのに丸2日使ってしまいました。というのもローカルだと普通に動くんですよね。サーバに入ってるImageMagickのアップデートにも多大な時間を使ってしまいました(結局できず)。こういう問題へのアプローチはもっと考えないと無駄に時間つかちゃうなと思いました。