2012-09-06 44 views
10

Tôi đang chơi xung quanh với PIL và đã gặp phải vấn đề này và tôi không thể nhìn thấy nơi trong tài liệu tôi đang đi sai. Đây là mã đơn giản của tôiPython PIL ValueError: hình ảnh không khớp với

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") 

mang đến cho tôi những lỗi

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 

Bất kỳ trợ giúp sẽ được đánh giá

+5

Có phải 'imageA.mode == imageB.mode' không? – cgohlke

+1

Có vẻ như đó là vấn đề với các chế độ hình ảnh, chúng phải giống nhau! –

+0

Có 'image1.png' có cùng kích thước với' image2.png' không? –

Trả lời

19

Các tài liệu cho chức năng này không nói nhiều trong thực tế. Vì vậy, hãy để tôi cố gắng làm rõ nó một chút. Đầu tiên, kích thước của hình ảnh không liên quan đến việc chức năng có hoạt động hay không, nó kiểm tra nội bộ cho một kích thước vừa phù hợp với cả hai hình ảnh.

Bây giờ, khi nào bạn thực sự có thể so sánh hình ảnh bằng cách sử dụng hàm ImageChops.difference?

Đầu tiên, cả hai hình ảnh phải có pixel có thể được lưu trữ trong một byte chưa ký. Đây là một loại hình ảnh rất phổ biến, nhưng điều này loại trừ sự so sánh giữa các hình ảnh ngay cả khi chúng là cùng một chế độ. Vì vậy, bạn không thể so sánh một hình ảnh xy khi một hoặc/cả/trong số họ có một phương thức: F, I, I;16, I;16L, I;16B, BGR;15, BGR;16, , hoặc BGR;32. Chỉ cần để làm cho nó rõ ràng: nó không quan trọng nếu cả hai hình ảnh đang ở trong cùng một chế độ nếu chúng xảy ra được ở một trong các chế độ trên, chức năng sẽ từ chối làm việc.

Vì vậy, việc so sánh có thể được thực hiện khi những hình ảnh trong chế độ 1, P, L, LA, RGB, RGBA, RGBX, RGBa, CMYK, hoặc YCbCr miễn là họ có cùng một số ban nhạc. Điều này có nghĩa là hình ảnh không cần phải có cùng một chế độ để so sánh. Ví dụ: difference(x.convert('CMYK'), x.convert('RGBA')) hoặc difference(x.convert('1'), x.convert('P')) chỉ hoạt động tốt. Tất nhiên điều này có nghĩa là difference(x.convert('LA'), x.convert('L')), không thành công. Cuối cùng, ảnh kết quả sẽ luôn có chế độ bằng với hình ảnh đầu tiên được truyền cho hàm.

Điều này hợp lệ ít nhất cho PIL 1.1.7.

Các vấn đề liên quan