我正在玩PIL并遇到了这个问题,我无法看到文档中哪里出错了。这是我的简单代码
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")
给了我错误
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
任何帮助将不胜感激
答案 0 :(得分:24)
此功能的文档实际上并没有多少说明。所以让我试着澄清一下。首先,图像的大小与函数是否有效无关,它在内部检查两个图像的大小。
现在,您何时可以使用函数ImageChops.difference
实际比较图像?
首先,两个图像都必须具有可以存储在无符号字节中的像素。这是一种非常常见的图像类型,但这排除了图像之间的比较,即使它们是相同的模式。因此,如果图片x
和y
的模式为:F
,I
,I;16
,{ {1}},I;16L
,I;16B
,BGR;15
,BGR;16
或BGR;24
。只是为了说清楚:如果两个图像碰巧处于上述模式之一,如果两个图像处于相同模式并不重要,则该功能将拒绝工作。
因此,当图像处于BGR;32
,1
,P
,L
,LA
,{{1}模式时,可以进行比较}},RGB
,RGBA
,RGBX
或RGBa
只要它们具有相同数量的波段。这意味着图像不必具有相同的模式。例如,CMYK
或YCbCr
工作正常。当然这意味着difference(x.convert('CMYK'), x.convert('RGBA'))
失败了。最后,生成的图像将始终具有与传递给函数的第一个图像相同的模式。
这至少对PIL 1.1.7有效。