Как читать заголовок файла bmp в python?

Мне нужно прочитать заголовок bmp-файла с помощью python. Я пробовал, как это, но он, очевидно, возвращает только кучу неочевидных байтов:

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

Моя идея заключалась в том, чтобы найти модуль или что-то быстрое, чтобы записывать информацию об изображении во время его открытия. Я знаю об этой функции в MATLAB , которая делает именно то , что я хочу: imfinfo(). Но я не могу найти аналог в python.

Чтобы быть ясным, это то, что я получаю с помощью 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

python,image-processing,bitmap,bmp,

2

Ответов: 1


1 принят

Вы можете использовать модуль imghdr (который находится в python stdlib):

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

Это извлечет тип изображения из заголовка, но это все. В стандартной библиотеке Python нет ничего, что могло бы получить более подробную информацию - вам нужна сторонняя библиотека для выполнения такой специализированной задачи. Чтобы получить представление о сложности этого, взгляните на формат BMP-файла . Основываясь на спецификации, изложенной там, возможно было бы написать некоторый чистый код Python для извлечения нескольких элементов информации, но будет нелегко получить это право для произвольного файла изображения растрового изображения.

ОБНОВЛЕНИЕ :

Ниже приведен простой сценарий для извлечения некоторой базовой информации из заголовка растрового изображения с использованием модуля struct . См. Формат файла BMP, упомянутый выше, для того, как интерпретировать различные значения, и обратите внимание, что этот скрипт будет работать только с наиболее распространенной версией формата (например, 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)))

вывод:

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        
Python, процессор обработки изображений, растровые, BMP,
Похожие вопросы