2010-02-13 17 views
10

Ich habe eine Datei, die ein einzelnes Bild eines bestimmten Formats bei einem spezifischen Offset enthält. Ich kann bereits eine dateiähnliche Datei für das eingebettete Bild erhalten, das read(), seek() und tell() unterstützt. Ich möchte eines vorhandenen PIL-Decoders nutzen, um das eingebettete Bild zu behandeln, aber in der Lage sein, die gesamte Datei als eigenständige "Image-Datei" zu behandeln.Erweitern eines PIL-Decoders

Ich habe nicht in der Lage gewesen, um herauszufinden, wie dies die documentation available gegeben zu tun und habe mich gefragt, ob jemand irgendwelche Erkenntnisse hatte, wie ich konnte dies tun.

Antwort

3

Was ich getan habe, um dies zu lösen, war von dem ImageFile.ImageFile Kind abgeleitet, das zu dem eingebetteten Format statt ImageFile.ImageFile direkt gehört. Dann in _open() ersetzte ich self.fp mit der Datei-ähnlich zum eingebetteten Bild, und rief die _open() des Elternteils. Ich kann nicht sagen, dass ich besonders glücklich bin, es so zu machen, aber es scheint zu funktionieren.

+0

Klingt wie gute Wiederverwendung von Code. F: Hat Ihr Ansatz dazu geführt, dass ein neuer Bildtyp und eine neue Erweiterung registriert wurden, und wenn ja, war es schwierig, dies zu tun? – martineau

+0

@martineau: Ich brauchte dies, um auf einem vorhandenen binären Datenstrom zu arbeiten, also versuchte ich nichts zu registrieren. Um genau zu sein, las ich ein PNG, eingebettet in eine Spieledatei. –

7

Die entsprechenden Kapitel der Dokumentation ist this one und ich denke, es ist ziemlich klar: wenn Sie zum Beispiel Bilddateien in den neuen .zap -Format entschlüsseln wollen, schreiben Sie eine ZapImagePlugin.py Modul, das ein paar Dinge durchführen müssen:

  • haben eine class ZapImageFile(ImageFile.ImageFile): mit String-Attribute format und format_description, und eine Hook-Methode def _open(self) (von denen später);
  • auf Modulebene, Image.register_open('zap', ZapImageFile) und Image.register_extension('ZAP', '.zap')

Die Spezifikationen für die _open Verfahren sind sehr deutlich im Kapitel angelegt - es Bilddaten und Metadaten aus offenen Binärdatei ähnlichen Objekt self.fp, erhöhen SyntaxError lesen muß (oder eine andere Ausnahme) so schnell wie möglich, wenn es erkennt, dass die Datei im richtigen Format nicht wirklich ist, zumindest self.size und self.mode Attribute gesetzt und um Lesen das Bild zu ermöglichen, auch self.tile, eine Liste von Kachel Deskriptoren wieder in die Forma Die Angabe in diesem Kapitel (einschließlich der Datei-Offset, die Sie sagen, wissen, und ein Decoder - wenn die Roh-oder Bit-Decoder, die im Kapitel dokumentiert, nicht Ihren Bedürfnissen entsprechen, empfiehlt das Kapitel, die Quellen von einigen zu studieren von den vielen gelieferten Decodern, wie JPEG, PNG, usw.).

Verwandte Themen