注意:我對Encoding/Decoding沒有太多瞭解,但是在遇到這個問題後,這些單詞對我來說已經是完整的術語。Python編碼:打開/讀取圖像文件,解碼圖像,重新編碼圖像
問題: 我在這裏有點困惑。我正在玩編碼/解碼圖像,在django模型中存儲圖像作爲TextField
,環顧Stack Overflow,我發現我可以解碼來自ascii
的圖像(我認爲還是二進制?無論open('file', 'wb')
用作編碼,假設默認ascii
)到latin1
,並將其存儲在數據庫中沒有問題。
問題來自於從latin1
解碼數據創建圖像。當試圖寫入文件句柄時,我得到一個UnicodeEncodeError
,說ascii
編碼失敗。
我認爲問題是當打開一個文件爲二進制數據(rb
)它不是一個合適的ascii
編碼,因爲它包含二進制數據。然後我將二進制數據解碼到latin1
,但是當轉換回ascii
(嘗試寫入文件時自動編碼)時,它會失敗,原因不明。
我的猜測是要麼當解碼到latin1
原始二進制數據轉換爲其他東西,然後當試圖編碼回ascii
它不能識別什麼是原始的二進制數據。 (儘管原始數據和解碼數據具有相同的長度)。 或者問題不在於解碼爲latin1
,而是我試圖對二進制數據進行ASCII編碼。在這種情況下,我如何將latin1
數據編碼回圖像。
我知道這很混亂,但我很困惑,所以我不能很好地解釋它。如果任何人都可以回答這個問題,可能有一個謎語大師。
一些代碼,以可視化:
>>> image_handle = open('test_image.jpg', 'rb')
>>>
>>> raw_image_data = image_handle.read()
>>> latin_image_data = raw_image_data.decode('latin1')
>>>
>>>
>>> # The raw data can't be processed by django
... # but in `latin1` it works
>>>
>>> # Analysis of the data
>>>
>>> type(raw_image_data), len(raw_image_data)
(<type 'str'>, 2383864)
>>>
>>> type(latin_image_data), len(latin_image_data)
(<type 'unicode'>, 2383864)
>>>
>>> len(raw_image_data) == len(latin_image_data)
True
>>>
>>>
>>> # How to write back to as a file?
>>>
>>> copy_image_handle = open('new_test_image.jpg', 'wb')
>>>
>>> copy_image_handle.write(raw_image_data)
>>> copy_image_handle.close()
>>>
>>>
>>> copy_image_handle = open('new_test_image.jpg', 'wb')
>>>
>>> copy_image_handle.write(latin_image_data)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)
>>>
>>>
>>> latin_image_data.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)
>>>
>>>
>>> latin_image_data.decode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)
我開始在維基百科上查找jpg,然後純文本文件。一個圖像文件不會有任何純文本數據可以被編碼成ascii。他們只是不同類型的數據,蘋果和桔子,純文本文件和二進制文件 –
因此,我可以從ascii解碼圖像數據,但只是沒有回到它?那意味着這是一種單向轉換? – Crispy
等待,當打開一個文件爲二進制文件時,它的編碼是什麼?我知道python默認爲ascii,但這是原始數據正確嗎?該死,我不能通過這個。 – Crispy