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

1853
P. Ktinos

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

enter image description here

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

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

0

1 ответ на вопрос

2
Yorik

Вот документация для 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 (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 создает изображение, то программа использует документацию и стандарты для автоматизации процесса. В основном это вопрос соглашения. «Поток изображения» (данные пикселей) сохраняется и обрабатывается в памяти аналогично тому, как вы видите в несжатом файле изображения.

О, ты прав. Я был в замешательстве при запуске, потому что 1) из случайных «00» и 2) из ​​обращенных шестнадцатеричных значений цвета, но с помощью шестнадцатеричного редактора я заменил все «24 1C ED» на «00 FF 00», чтобы поменять местами изображение и цель моего примера (изменение цвета с красного на зеленый) была достигнута. Благодарю. P. Ktinos 8 лет назад 0
Нет проблем. Документы говорят что-то о «заполнении для 4-байтового выравнивания» и о полной строке из 5 пикселей плюс один байт = 16 байтов (или 4 набора по 4). Таким образом, размер заполнения будет варьироваться от 0 до 3 байтов. Yorik 8 лет назад 0
они называют порядок байтов "порядком байтов". Я полагаю, что пример здесь "Little-endian". Насколько я помню, endianness была проблемой повторного использования кода между старыми компьютерами Mac и старыми ПК, что не позволяло людям тратить время на создание кроссплатформенного программного обеспечения. Yorik 8 лет назад 0