2010-02-13 14 views
10

Ho un file che contiene una singola immagine di un formato specifico in uno specifico offset . Posso già ottenere un file simile per l'immagine incorporata che supporta read(), seek() e tell(). Voglio sfruttare di un decodificatore PIL esistente per gestire l'immagine incorporata, ma essere in grado di considerare l'intero file come un "file immagine" a sé stante.Estensione di un decoder PIL

non sono stato in grado di capire come fare questo dato il documentation available e chiedevo se qualcuno avesse qualche intuizioni su come avrei potuto fare questo .

risposta

3

Quello che ho fatto per risolvere questo è stato derivare dal figlio ImageFile.ImageFile appartenente al formato incorporato invece di ImageFile.ImageFile direttamente. Quindi in _open() ho sostituito self.fp con il file simile all'immagine incorporata e ho chiamato il numero _open() del genitore. Non posso dire di essere particolarmente contento di farlo in questo modo, ma sembra che abbia funzionato.

+0

Sembra un buon riutilizzo del codice. D: Il tuo approccio ha comportato la registrazione di un nuovo tipo di immagine e di un'estensione e, in caso affermativo, c'era qualcosa di complicato nel farlo? – martineau

+0

@martineau: avevo bisogno di questo per operare su un flusso binario esistente, quindi non ho tentato di registrare nulla. Per essere precisi, stavo leggendo un PNG incorporato in un file di dati di gioco. –

7

relativo capitolo dei documenti è this one e penso che sia abbastanza chiaro: se per esempio si desidera decodificare i file di immagine nel nuovo .zap -format, si scrive un modulo ZapImagePlugin.py che deve eseguire un paio di cose:

  • hanno uno class ZapImageFile(ImageFile.ImageFile): con attributi di stringa format e format_description e un metodo di aggancio def _open(self) (di cui più avanti);
  • a livello di modulo, Image.register_open('zap', ZapImageFile) e Image.register_extension('ZAP', '.zap')

le specifiche per il metodo _open sono molto chiaramente definite nel capitolo - deve leggere i dati di immagini e metadati da aprire oggetto simile a file binario self.fp, alzare SyntaxError (o un'altra eccezione) ASAP se rileva che il file non è in realtà nel giusto formato, impostare almeno self.size e self.mode attributi, e al fine di consentire lettura l'immagine, anche self.tile, un elenco di descrittori piastrelle di nuovo in la forma t specificato in quel capitolo (incluso il file-offset, che dici di sapere, e un decodificatore - se i raw o bit decoders, documentati nel capitolo, non soddisfano le tue esigenze, il capitolo raccomanda di studiare le fonti di alcuni dei molti decodificatori forniti, come JPEG, PNG, ecc.).