2015-01-07 51 views
1

我在PIL打開的圖像,像這樣:從PIL.Image獲取二進制圖像數據?

from PIL import Image 

i = Image.open("image.jpg") 

我需要訪問該文件的原始內容。我怎樣才能得到整個圖片數據,就好像我會完成open(...).read()

+0

既然你接受了 「.tobytes」 的問題,我要離開這個評論以向未來的讀者說明:你實際上想要的是「原始像素數據」,而不是「文件的原始內容」 - 這正是我解釋如何得到的。 – jsbueno

+0

哦,真的嗎?然後我會接受你的答案,我想要原始的原始文件。 –

回答

2

PIL使用懶惰的打開機制,其中僅在需要時纔讀取文件內容。如果這樣做,它可能會在某些內部(私有)屬性中保留文件引用。

即使這個屬性是可訪問的,它當然不會作爲官方PIL API的一部分暴露出來 - 它當然不意味着以這種方式使用。

一旦數據被讀取,文件內容被解碼,並保存在內存中作爲像素值 - (這通常是處理圖像時所需的)。該庫肯定不會將未解碼的文件數據保存在內存中的數據結構中,因爲它沒有意義。

如果您對原始文件內容進行處理,您可能會使用其他模塊處理圖像或存儲該圖像,或者將數據以不可知的 形式迭代到實際圖像內容 - 您不可以只需打開文件回常規「開放」?

+0

確實如此。在創建時,有一個'Image.fp'屬性可用,它指向用於創建'Image'對象的原始文件。只要它的全部內容沒有被'Image'對象讀取,該屬性就指向該文件。只要發生這種情況'Image.fp'將指向'None',並且不再保留對原始文件的引用。 –

3

如果你想獲得圖像的實際字節,只需使用i.tobytes()。這是與Pillow,我不知道它是否在原來的PIL模塊,但從它應該是文檔。

+0

這仍然不會給你原始文件的字節,只有來自內存的原始(未壓縮)圖像字節。很容易驗證你是否有一個小圖像。 (0);' 'img == f.read(');''''=' ();' 應評估爲'False' –

9

你可以看到這個答案需要重新保存python Image PIL to binary Hex

的IMG對象;其寫入到另一個BytesIO 對象:

output = io.BytesIO() 
img.save(output, format='JPEG') 

然後獲得與.getvalue寫入數據()方法:

hex_data = output.getvalue() 
+0

我正在使用Microsoft Cognition API,它需要二進制圖像數據。 我第一次嘗試通過使用常規打開功能發送數據,並嘗試使用base64編碼/解碼,但它沒有奏效。 雖然這確實奏效,所以如果有人在將來使用它,嘗試獲取這種形式的數據。 –