2010-02-13 75 views
10

我有一個文件,其中包含特定格式的特定偏移量的單個圖像。我已經可以獲得類似於嵌入式圖像 的文件,它支持read()seek()tell()。我想利用現有PIL解碼器的 來處理嵌入式圖像,但是能夠將整個文件視爲「圖像文件」。擴展PIL解碼器

我一直無法弄清楚如何做到這一點給出的 documentation available,想知道如果任何人有任何見解,我怎麼能 做到這一點。

回答

3

我所做的解決這個問題的方法是從屬於嵌入格式的ImageFile.ImageFile孩子直接取代ImageFile.ImageFile。然後在_open()中,我將self.fp替換爲嵌入圖像的文件,並調用父母的_open()。我不能說這樣做讓我特別開心,但它似乎奏效了。

+0

聽起來像很好的代碼重用。問:你的方法是否導致新的圖像類型和擴展名被註冊,如果是的話,是否有什麼棘手的做法呢? – martineau 2015-01-20 15:25:42

+0

@martineau:我需要這個操作現有的二進制流,所以我沒有嘗試註冊任何東西。具體來說,我正在閱讀嵌入遊戲數據文件中的PNG。 – 2015-01-20 16:04:34

7

的文檔的相關章節爲this one,我認爲這是相當明顯的:例如,如果你想在新的.zap -format的圖像文件進行解碼,你寫一個ZapImagePlugin.py模塊,它必須執行兩件事情:

  • 有一個class ZapImageFile(ImageFile.ImageFile):與字符串屬性formatformat_description,和鉤子方法def _open(self)(其中更多);
  • 在模塊級,Image.register_open('zap', ZapImageFile)Image.register_extension('ZAP', '.zap')

_open方法的規格在本章的非常明確的規定 - 它必須從開放二進制文件的對象self.fp讀取圖像數據和元數據,提高SyntaxError (或其他異常)儘快如果它檢測到該文件實際上並不是以正確的格式,設置至少self.sizeself.mode屬性,爲了讓閱讀形象,也self.tile瓦塊描述符名單再次形式(包括你說你知道的文件偏移量和解碼器 - 如果本章中記錄的原始或位解碼器不符合你的需要,本章建議研究一些源代碼許多提供的解碼器,如JPEG,PNG等)。