Вот документация для BMP: https://en.wikipedia.org/wiki/BMP_file_format#Pixel_array_.28bitmap_data.29
Краткая форма:
- Заголовок BMP 14 байтов (информация о файле)
- 40-байтовый заголовок DIB (информация об изображении)
- пикселей
В разделе заголовка DIB вы можете видеть два значения 5 для размеров в пикселях и значение hex(18) для 24-битного цвета (RGB).
Особый интерес представляет "Пример 1" в вики, который показывает HEX-дамп для изображения 2x2, похожего на то, что у вас есть здесь. Несколько заметок:
- визуально, байт представляет собой двузначный куплет (первый байт на вашем изображении - 42).
- отсчет начинается с 0, поэтому "смещение 31" - это 32-й байт.
- все числа - HEX, поэтому hex (10) = dec (16). Вы можете использовать калькулятор Windows, установленный в "режим программиста", если вам нужна помощь в конвертации.
- "порядок байтов" от низкого до высокого, поэтому 4-байтовое значение "05 00 00 00" следует понимать как "00 00 00 05"
- триплеты RGB в BMP меняются местами
Основываясь на шестнадцатеричном дампе и документации, ваше изображение сохраняет каждый пиксель в виде несжатого RGB-триплета. Первый пиксель - это триплет 24 1c ed
, но он перевернут, так что это шестнадцатеричный (ed1c24), который действительно красного цвета. Обратите внимание, что после каждой строки по 5 пикселей есть пэд 00
. В документации сказано, что это для "выравнивания байтов".
Таким образом, чтобы изменить пиксель с красного на синий, вы можете изменить один из триплетов с 24 1c ed
на ed 1c 24
.
Что касается программного обеспечения, вы должны открыть файл (или копию) с помощью Hex Editor, внести изменения и сохранить его. Простого использования текстового редактора в "режиме редактирования текста" недостаточно, поскольку текстовый символ "0" не совпадает с двоичным числовым значением 0.
Notepad++ с открытым исходным кодом имеет возможность шестнадцатеричного редактирования с помощью плагинов.
Что касается более крупного вопроса о том, как Paint создает изображение, то программа использует документацию и стандарты для автоматизации процесса. В основном это вопрос соглашения. "Поток изображения" (данные пикселей) сохраняется и обрабатывается в памяти аналогично тому, как вы видите в несжатом файле изображения.