¿Cómo leer el encabezado del archivo bmp en python?

Necesito leer el encabezado de un archivo bmp con python. Intenté esto, pero obviamente devuelve solo un montón de bytes no inteligibles:

f = open(input_filename,"rb") data = bytearray(f.read()) f.close() print(data[:14]) 

Mi idea fue encontrar un módulo, o algo rápido, para registrar la información de la imagen mientras se abre. Conozco esta función en matlab que hace exactamente lo que quiero: imfinfo() . Pero no puedo encontrar una contraparte en python.

Para ser claros, esto es lo que consigo con matlab:

  FileModDate: '20-Oct-2017 09:42:24' FileSize: 1311798 Format: 'bmp' FormatVersion: 'Version 3 (Microsoft Windows 3.x)' Width: 1280 Height: 1024 BitDepth: 8 ColorType: 'indexed' FormatSignature: 'BM' NumColormapEntries: 256 Colormap: [256x3 double] RedMask: [] GreenMask: [] BlueMask: [] ImageDataOffset: 1078 BitmapHeaderSize: 40 NumPlanes: 1 CompressionType: 'none' BitmapSize: 1310720 HorzResolution: 0 VertResolution: 0 NumColorsUsed: 256 NumImportantColors: 0 

Puede usar el módulo imghdr (que se encuentra en el stdlib de python):

 >>> import imghdr >>> print(imghdr.what(input_filename)) bmp 

Esto extraerá el tipo de imagen del encabezado, pero eso es todo. No hay nada más en la biblioteca estándar de Python que pueda obtener información más detallada: necesita una biblioteca de terceros para realizar una tarea tan especializada. Para tener una idea de la complejidad de esto, eche un vistazo al formato de archivo BMP . De acuerdo con la especificación que se describe allí, podría ser factible escribir un código Python puro para extraer algunos elementos de información, pero no será fácil hacerlo correctamente para un archivo de imagen de bitmap arbitrario.

ACTUALIZACIÓN :

A continuación se muestra un script simple para extraer información básica de un encabezado de bitmap utilizando el módulo struct . Consulte el formato de archivo BMP mencionado anteriormente para saber cómo interpretar los diversos valores, y tenga en cuenta que este script solo funcionará con la versión más común del formato (es decir, BITMAPINFOHEADER de Windows):

 import struct bmp = open(fn, 'rb') print('Type:', bmp.read(2).decode()) print('Size: %s' % struct.unpack('I', bmp.read(4))) print('Reserved 1: %s' % struct.unpack('H', bmp.read(2))) print('Reserved 2: %s' % struct.unpack('H', bmp.read(2))) print('Offset: %s' % struct.unpack('I', bmp.read(4))) print('DIB Header Size: %s' % struct.unpack('I', bmp.read(4))) print('Width: %s' % struct.unpack('I', bmp.read(4))) print('Height: %s' % struct.unpack('I', bmp.read(4))) print('Colour Planes: %s' % struct.unpack('H', bmp.read(2))) print('Bits per Pixel: %s' % struct.unpack('H', bmp.read(2))) print('Compression Method: %s' % struct.unpack('I', bmp.read(4))) print('Raw Image Size: %s' % struct.unpack('I', bmp.read(4))) print('Horizontal Resolution: %s' % struct.unpack('I', bmp.read(4))) print('Vertical Resolution: %s' % struct.unpack('I', bmp.read(4))) print('Number of Colours: %s' % struct.unpack('I', bmp.read(4))) print('Important Colours: %s' % struct.unpack('I', bmp.read(4))) 

salida:

 Type: BM Size: 287518 Reserved 1: 0 Reserved 2: 0 Offset: 1078 DIB Header Size: 40 Width: 657 Height: 434 Colour Planes: 1 Bits per Pixel: 8 Compression Method: 0 Raw Image Size: 286440 Horizontal Resolution: 11811 Vertical Resolution: 11811 Number of Colours: 256 Important Colours: 0