2012-09-06 27 views
10

私はPILで遊んでいて、この問題に遭遇しました。文書のどこが間違っているのかわかりません。ここでは私にエラーPython PIL ValueError:画像が一致しません

Traceback (most recent call last): 
    File "C:\[XXX]\box-test.py", line 8, in <module> 
    diff = difference(imageA, imageB) 
    File "C:\Python32\lib\site-packages\PIL\ImageChops.py", line 123, in difference 
    return image1._new(image1.im.chop_difference(image2.im)) 
ValueError: images do not match 

を与え、私の単純なコード

from PIL import Image 
from PIL.ImageChops import difference 

imageA = Image.open("image1.png") 
imageB = Image.open("image2.png") 

if imageA.size == imageB.size: 
    diff = difference(imageA, imageB) 
    diff.save("test.png") 

は、すべてのヘルプは、この関数のドキュメントは、実際に多くを教えてくれない

+5

'imageA.mode == imageB.mode'ですか? – cgohlke

+1

画像モードに問題があるように見えますが、同じでなければなりませんでした。 –

+0

'image1.png'は' image2.png'と同じ次元ですか? –

答えて

19

をいただければ幸いです。だから私はそれを少し明確にしようとしましょう。第1に、画像のサイズは、機能が機能するか否かに関係なく、両方の画像が適合するサイズを内部的にチェックする。

ここで、実際に画像を比較するには、ImageChops.differenceを使用しますか?

最初に、両方のイメージは、符号なしバイトに格納できるピクセルを持つ必要があります。これは非常に一般的なタイプの画像ですが、同じモードであっても画像の比較は除きます。 FII;16I;16LI;16BBGR;15BGR;16、、またはBGR;32:1または/それらの両方の/はのモードを持っているときに、あなたがイメージxyを比較することはできません。上記のモードのいずれかにある場合、両方の画像が同じモードにあるかどうかは関係ありません。機能は動作しません。

画像があれば、それらがバンドの数が同じようにモード1PLLARGBRGBARGBXRGBaCMYK、又はYCbCrにあるときに、比較を行うことができます。これは、画像が比較されるべき同じモードを有する必要はないことを意味する。たとえば、difference(x.convert('CMYK'), x.convert('RGBA'))またはdifference(x.convert('1'), x.convert('P'))は正常に機能します。もちろん、これはdifference(x.convert('LA'), x.convert('L'))を意味し、失敗します。最後に、結果として得られるイメージは常に、関数に渡される最初のイメージと等しいモードを持ちます。

これは少なくともPIL 1.1.7で有効です。

関連する問題