Для простоты эксперимента, я сделал BMP файл размером 1х1 пиксель, сохранённый без сжатия.
Наша задача — достать RGB информацию этого единственного пикселя.
Файл я сделал в Photoshop и закрасил пиксель цветом [255, 128, 50]. Сохранил с глубиной цвета 24 бит (по 8 бит на канал, то есть 1 байт).
Вооружившись спецификацией формата BMP мы можем рассчитать где что записано в таком файле.
В начале файла записаны заголовки с различной информацией. Для её отображения можете использовать этот код.
Эти данные активно используют программы-просмотрщики. Например, первые два байта это сигнатура файла (вспоминаем посты по этой тему).
Полезное для нас поле - DataOffset, которое говорит где начинаются данные относительно начала файла.
Offset: 54
То есть, с начала файла надо пропустить 54 байта, после чего пойдут пиксели! Так и сделаем.Открываем файл
file = open('one_pixel.bmp', 'rb')
Пропускаем 54 байтаfile.seek(54)
В разделе Additional Info в спецификации написано, что порядок записи каналов такой: BGR. Поэтому забираем наши данные о каналах в таком же порядкеb, g, r = struct.unpack('BBB', file.read(3))
file.close()
Почему "B"? Потому что в спецификации указано, что на канал использовано по 1 байту.Проверяем
print(f'R:{r} G:{g} B:{b}')
R:255 G:128 B:50
Отлично, мы добыли то что нам требовалось 😊PS:
Кто в теме, может покопаться в скрипте для парсинга бинарника mb-файла (файл сцены Autodesk Maya)
https://github.com/westernx/mayatools/blob/master/mayatools/binary.py
#libs