TGTGInsighttelegram intelligenceLIVE / telegram public index
← Python Заметки
Python Заметки avatar

TGINSIGHT POST

Post #245

@pythonotes

Python Заметки

Views1,620Post view count
PostedMay 1405/14/2021, 09:00 AM
Post content

Post content

Исследуем бинарный файл с изображением. Файл примера можно забрать сразу после этого поста. Для простоты эксперимента, я сделал 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