2010-02-13 16 views
10

Tengo un archivo que contiene una sola imagen de un formato específico en un offset específico de . Ya puedo obtener un archivo similar a la imagen incrustada que admite read(), seek() y tell(). Quiero aprovechar de un decodificador PIL existente para manejar la imagen incrustada, pero poder tratar el archivo completo como un "archivo de imagen" en sí mismo.Extendiendo un decodificador PIL

no he sido capaz de averiguar cómo hacer esto dado el documentation available y me preguntaba si alguien tenía alguna ideas en cuanto a cómo podría hacer esto.

Respuesta

3

Lo que hice para resolver esto fue derivar del niño ImageFile.ImageFile que pertenece al formato incrustado en lugar de ImageFile.ImageFile directamente. Luego, en _open(), reemplacé self.fp con un archivo similar a la imagen incrustada, y llamé al padre _open(). No puedo decir que estoy particularmente feliz de hacerlo de esta manera, pero parece haber funcionado.

+0

Parece una buena reutilización de código. P: ¿Su enfoque dio como resultado que se registrara un nuevo tipo de imagen y una extensión y, de ser así, hubo algún inconveniente al hacerlo? – martineau

+0

@martineau: Necesitaba esto para operar en una secuencia binaria existente, así que no intenté registrar nada. Para ser específico, estaba leyendo un archivo PNG incrustado en un archivo de datos del juego. –

7

el capítulo correspondiente de la documentación es this one y yo creo que es bastante claro: si por ejemplo desea decodificar archivos de imagen en el nuevo .zap -format, se escribe un módulo de ZapImagePlugin.py que debe llevar a cabo un par de cosas:

  • tienen class ZapImageFile(ImageFile.ImageFile): con atributos de cadena format y format_description, y un método de gancho def _open(self) (más adelante);
  • a nivel de módulo, Image.register_open('zap', ZapImageFile) y Image.register_extension('ZAP', '.zap')

Las especificaciones para el método _open se establecen muy claramente en el capítulo - que debe leer datos de imagen y los metadatos de objeto de fichero binario abierta self.fp, aumentar SyntaxError (u otra excepción) lo antes posible si detecta que el archivo no está realmente en el formato adecuado, ajustado al menos self.size y self.mode atributos, y con el fin de permitir lectura la imagen, también self.tile, una lista de descriptores baldosas de nuevo en la forma t especificado en ese capítulo (incluido el offset de archivos, que usted dice que conoce, y un decodificador; si los decodificadores crudos o de bits, documentados en el capítulo, no satisfacen sus necesidades, el capítulo recomienda estudiar las fuentes de algunos de los muchos decodificadores suministrados, como JPEG, PNG, etc.).