Python PIL ValueError: изображения не совпадают

Я играю с 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

Любая помощь будет оценена

Ответ 1

Документация для этой функции практически не говорит. Поэтому позвольте мне немного прояснить это. Во-первых, размеры изображений не имеют значения, работает ли функция или нет, она внутренне проверяет размер, который оба изображения соответствуют.

Теперь, когда вы можете сравнить изображения с помощью функции ImageChops.difference?

Во-первых, оба изображения должны иметь пиксели, которые могут быть сохранены в байтах без знака. Это очень распространенный тип изображения, но это исключает сравнение изображений, даже если они являются одним и тем же режимом. Таким образом, вы не можете сравнивать изображение x и y, когда один или/оба/из них имеют режим: F, I, I;16, I;16L, I;16B, BGR;15, BGR;16, BGR;24 или BGR;32. Просто чтобы было ясно: неважно, находятся ли оба изображения в одном и том же режиме, если они находятся в одном из режимов выше, функция откажется работать.

Таким образом, сравнение может быть выполнено, когда изображения находятся в режимах 1, P, L, LA, RGB, RGBA, RGBX, RGBA, CMYK или 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.