我有一個文件,其中包含特定格式的特定偏移量的單個圖像。我已經可以獲得類似於嵌入式圖像 的文件,它支持read()
,seek()
和tell()
。我想利用現有PIL解碼器的 來處理嵌入式圖像,但是能夠將整個文件視爲「圖像文件」。擴展PIL解碼器
我一直無法弄清楚如何做到這一點給出的 documentation available,想知道如果任何人有任何見解,我怎麼能 做到這一點。
我有一個文件,其中包含特定格式的特定偏移量的單個圖像。我已經可以獲得類似於嵌入式圖像 的文件,它支持read()
,seek()
和tell()
。我想利用現有PIL解碼器的 來處理嵌入式圖像,但是能夠將整個文件視爲「圖像文件」。擴展PIL解碼器
我一直無法弄清楚如何做到這一點給出的 documentation available,想知道如果任何人有任何見解,我怎麼能 做到這一點。
我所做的解決這個問題的方法是從屬於嵌入格式的ImageFile.ImageFile
孩子直接取代ImageFile.ImageFile
。然後在_open()
中,我將self.fp
替換爲嵌入圖像的文件,並調用父母的_open()
。我不能說這樣做讓我特別開心,但它似乎奏效了。
的文檔的相關章節爲this one,我認爲這是相當明顯的:例如,如果你想在新的.zap
-format的圖像文件進行解碼,你寫一個ZapImagePlugin.py
模塊,它必須執行兩件事情:
class ZapImageFile(ImageFile.ImageFile):
與字符串屬性format
和format_description
,和鉤子方法def _open(self)
(其中更多);Image.register_open('zap', ZapImageFile)
和Image.register_extension('ZAP', '.zap')
的_open
方法的規格在本章的非常明確的規定 - 它必須從開放二進制文件的對象self.fp
讀取圖像數據和元數據,提高SyntaxError
(或其他異常)儘快如果它檢測到該文件實際上並不是以正確的格式,設置至少self.size
和self.mode
屬性,爲了讓閱讀形象,也self.tile
的瓦塊描述符名單再次形式(包括你說你知道的文件偏移量和解碼器 - 如果本章中記錄的原始或位解碼器不符合你的需要,本章建議研究一些源代碼許多提供的解碼器,如JPEG,PNG等)。
聽起來像很好的代碼重用。問:你的方法是否導致新的圖像類型和擴展名被註冊,如果是的話,是否有什麼棘手的做法呢? – martineau 2015-01-20 15:25:42
@martineau:我需要這個操作現有的二進制流,所以我沒有嘗試註冊任何東西。具體來說,我正在閱讀嵌入遊戲數據文件中的PNG。 – 2015-01-20 16:04:34