2012-09-06 18 views
10

से मेल नहीं खाती हैं मैं पीआईएल के साथ खेल रहा हूं और इस समस्या से आया हूं और मैं नहीं देख सकता कि दस्तावेज़ों में मैं गलत कहां जा रहा हूं। यहाँ मेरी सरल कोडपायथन पीआईएल वैल्यूएरर: छवियां

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 

किसी भी मदद

+5

'imageA.mode == imageB.mode' है? – cgohlke

+1

ऐसा लगता है कि यह छवि मोड के साथ एक समस्या थी, उन्हें वही होना था! –

+0

'image1.png' के समान आयाम' image1.png' है? –

उत्तर

19

इस समारोह के लिए दस्तावेज़ की सराहना की जाएगी वास्तव में बहुत नहीं बताता है देता है। तो मैं इसे थोड़ा सा स्पष्ट करने की कोशिश करता हूं। सबसे पहले, छवियों के आकार इस बात के लिए अप्रासंगिक हैं कि फ़ंक्शन काम करता है या नहीं, यह आंतरिक रूप से उस आकार के लिए जांच करता है जो दोनों छवियां फिट होती हैं।

अब, आप वास्तव में फ़ंक्शन ImageChops.difference फ़ंक्शन का उपयोग करके छवियों की तुलना कब कर सकते हैं?

सबसे पहले, दोनों छवियों में पिक्सेल होना चाहिए जो एक हस्ताक्षरित बाइट में संग्रहीत किया जा सकता है। यह छवि का एक बहुत ही आम प्रकार है, लेकिन इसमें छवियों के बीच तुलना शामिल नहीं है, भले ही वे एक ही मोड हों। तो, आप एक छवि x और y तुलना नहीं कर सकते जब एक या/उन दोनों/की एक विधा है: F, I, I;16, I;16L, I;16B, BGR;15, BGR;16, , या 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')), विफल रहता है। अंत में, परिणामी छवि में हमेशा कार्य को पारित पहली छवि के बराबर मोड होगा।

यह कम से कम पीआईएल 1.1.7 के लिए मान्य है।

संबंधित मुद्दे