
Это шестнадцатеричный дамп растрового изображения 5x5, окрашенного в красный цвет:
Мой вопрос в том, как изменить только шестнадцатеричные значения (без использования инструмента вроде Paint), чтобы изменить цвет растрового изображения, например, на зеленый (0,255,0)
или на любой другой цвет?
Каким образом инструменты вроде Paint преобразуют нарисованные вами пиксели в шестнадцатеричные данные для сохранения растрового изображения?
решение1
Вот документация по BMP:https://en.wikipedia.org/wiki/BMP_file_format#Pixel_array_.28bitmap_data.29
Краткая форма:
- 14 байт заголовка BMP (информация о файле)
- 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
, но он перевернут, поэтому это hex(ed1c24), который действительно является красным цветом. Обратите внимание, что после каждой строки из 5 пикселей есть 00
пад. В документации говорится, что это для «выравнивания байтов».
Таким образом, чтобы изменить пиксель с красного на синий, вы можете изменить один из триплетов с 24 1c ed
на ed 1c 24
.
Что касается программного обеспечения, вы бы открыли файл (или копию) с помощью Hex Editor, внесли изменения и сохранили его. Простого использования текстового редактора в "режиме редактирования текста" недостаточно, поскольку текстовый символ "0" не то же самое, что и двоичное числовое значение 0.
В Notepad++ с открытым исходным кодом есть возможность редактирования шестнадцатеричных кодов с помощью плагинов.
Что касается более широкого вопроса о том, как Paint создает изображение, ну, программа использует документацию и стандарты для автоматизации процесса. Это в основном вопрос соглашения. «Поток изображения» (пиксельные данные) хранится и обрабатывается в памяти впохожийтаким же образом, как вы видите в несжатом файле изображения.