Как создать растровое изображение с "ручкой и бумагой"?

Это шестнадцатеричный дамп растрового изображения 5x5, окрашенного в красный цвет:

Мой вопрос, как мне изменить только шестнадцатеричные значения (без использования инструмента, такого как Paint), чтобы изменить цвет растрового изображения, например, зеленый цвет (0,255,0) или любой цвет в этом отношении?

Кроме того, каким образом инструменты типа Paint преобразуют пиксели, которые вы рисуете, в гекс, чтобы сохранить растровое изображение?

1 ответ

Решение

Вот документация для BMP: https://en.wikipedia.org/wiki/BMP_file_format

Краткая форма:

  • Заголовок BMP 14 байтов (информация о файле)
  • 40-байтовый заголовок DIB (информация об изображении)
  • пикселей

В разделе заголовка DIB вы можете видеть два значения 5 для размеров в пикселях и значение hex(18) для 24-битного цвета (RGB).

Особый интерес представляет "Пример 1" в вики, который показывает HEX-дамп для изображения 2x2, похожего на то, что у вас здесь. Несколько заметок:

  • визуально, байт представляет собой двузначный куплет (первый байт на вашем изображении - 42).
  • отсчет начинается с 0, поэтому "смещение 31" - это 32-й байт.
  • все числа являются шестнадцатеричными, поэтому hex(10) = dec(16). Вы можете использовать калькулятор Windows, установленный в "режим программиста", если вам нужна помощь в конвертации.
  • "порядок байтов" от низкого к высокому, поэтому 4-байтовое значение "05 00 00 00" следует понимать как "00 00 00 05"
  • тройки RGB в BMP меняются местами

Основываясь на шестнадцатеричном дампе и документации, ваше изображение сохраняет каждый пиксель в виде несжатого RGB-триплета. Первый пиксель это триплет 24 1c ed, но это наоборот, так что это шестнадцатеричный (ed1c24), который действительно красного цвета. Обратите внимание, что есть 00 прокладка после каждой строки по 5 пикселей. В документации сказано, что это для "выравнивания байтов".

Таким образом, чтобы изменить пиксель с красного на синий, вы можете изменить один из триплетов из 24 1c ed в ed 1c 24,

Что касается программного обеспечения, вы должны открыть файл (или копию) с помощью Hex Editor, внести изменения и сохранить его. Простого использования текстового редактора в "режиме редактирования текста" недостаточно, поскольку текстовый символ "0" не совпадает с двоичным числовым значением 0.

Notepad++ с открытым исходным кодом имеет возможность шестнадцатеричного редактирования с помощью плагинов.

Что касается более крупного вопроса о том, как Paint создает изображение, то программа использует документацию и стандарты для автоматизации процесса. В основном это вопрос соглашения. "Поток изображения" (данные пикселей) сохраняется и обрабатывается в памяти аналогично тому, как вы видите в несжатом файле изображения.

Другие вопросы по тегам