2013-01-15 61 views
1

我需要打開一個圖像,驗證圖像,然後重新打開它(見最後一句以下引自PIL文檔)PIL:驗證後如何重新打開圖像?

im.verify()

試圖確定該文件被破壞,而不實際解碼 的圖像數據。如果此方法發現任何問題,則會引發合適的例外情況。此方法僅適用於新打開的圖像;如果 圖像已被加載,則結果未定義。另外,如果您在使用此方法後需要加載圖像 ,則必須重新打開 圖像文件。

這是我在我的代碼,其中picture是一個Django InMemoryUploadedFile對象:

img = Image.open(picture) 
img.verify() 
img = Image.open(picture) 

前兩行的工作很好,但我得到第三行下面的錯誤(在哪裏「M試圖‘重啓’的形象):

IOError: cannot identify image file

什麼是重新打開圖像文件的正確方法,如文檔建議?

+0

django如何將這個因素考慮進去?什麼是「圖片」? – Eevee

+0

@Eevee感謝您的支持,我刪除了django標籤。 'picture'是一個InMemoryUploadedFile,它是一個圖像文件。 – sgarza62

回答

5

這是不比做

f = open('x.png') 
Image.open(f) 
Image.open(f) 

上面的代碼不起作用,因爲PIL文件中前進,而讀了前幾個字節(試圖)找出它的格式不同。在這種情況下嘗試使用第二個Image.open將失敗,因爲現在文件中的當前位置已經超過其圖像的標題。要確認這一點,您可以驗證f.tell()返回的內容。要解決此問題,您必須回到文件的起始位置,方法是在兩個Image.open調用之間執行f.seek(0),或者關閉並重新打開該文件。

+0

太棒了,我不知道!您能否提供一個簡單的例子來說明如何打開,驗證,關閉/尋找,然後重新打開? – sgarza62

+1

@ sgarza62我不確定我是否遵循,但你只需要做到這一點。 'f = open('x.png'); img = Image.open(f); img.verify(); f.seek(0); img = Image.open(f)'。而不是'f.seek(0)'你可以做'f.close(); f = open('x.png')'。我想我錯過了一些東西,因爲這不能變得更微不足道。 – mmgp

+0

這就是我的想法。我試過了,我得到一個錯誤:強制轉換爲Unicode:需要字符串或緩衝區,在第一行找到InMemoryUploadedFile('f = open(original)')...我想確保我不是遺漏了什麼。 – sgarza62

1

嘗試在verify和第二個open之間執行del img

相關問題