How to read bmp file header in python?

2019-07-12 03:06发布

I need to read the header of a bmp file with python. I tried like this but it obviously returns just a bunch of non intelligible bytes:

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

My idea was to find a module, or something fast, in order to log image info while opening it. I know about this function in matlab that does exactly what i want: imfinfo(). But I can't find a counterpart in python.

To be clear, this is what I get with 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

1条回答
放我归山
2楼-- · 2019-07-12 03:59

You can use the imghdr module (which is in the python stdlib):

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

This will extract the image type from the header, but that is all. There is nothing else in the Python standard library that can get more detailed information - you need a third-party library to do such a specialized task. To get an idea of the complexity of this, take at look at BMP file format. Based on the specification outlined there, it might be feasible to write some pure Python code to extract a few items of information, but it won't be easy to get it right for an arbitrary bitmap image file.

UPDATE:

Below is a simple script to extract some basic information from a bitmap header using the struct module. See the BMP file format mentioned above for how to interpret the various values, and note that this script will only work with the most common version of the format (i.e. Windows BITMAPINFOHEADER):

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)))

output:

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        
查看更多
登录 后发表回答