
Este é o dump hexadecimal de um bitmap 5x5 colorido com a cor vermelha:
Minha pergunta é: como altero apenas os valores hexadecimais (sem usar uma ferramenta como o Paint) para alterar a cor do bitmap para, por exemplo, a cor verde (0,255,0)
ou qualquer outra cor?
Em extensão, como ferramentas como o Paint convertem os pixels que você desenha em hexadecimal para salvar o bitmap?
Responder1
Aqui está a documentação para BMP:https://en.wikipedia.org/wiki/BMP_file_format#Pixel_array_.28bitmap_data.29
A forma abreviada é:
- Cabeçalho BMP de 14 bytes (informações do arquivo)
- Cabeçalho DIB de 40 bytes (informações da imagem)
- píxeis
Você pode ver na seção do cabeçalho DIB os dois valores 5 para as dimensões em pixels e um valor hex (18) para cores de 24 bits (RGB).
De particular interesse é o "Exemplo 1" no wiki, que mostra um dump HEX para uma imagem 2x2 semelhante à que você tem aqui. Algumas notas:
- um byte, visualmente, é um dístico de dois dígitos (o primeiro byte da sua imagem é 42).
- a contagem começa em 0, então "offset 31" é o 32º byte.
- os números são todos HEX, então hex (10) = dec (16). Você pode usar a calculadora do Windows configurada para "modo programador" se precisar de ajuda para converter.
- "ordem de bytes" é de baixo para alto, portanto, um valor de 4 bytes de "05 00 00 00" precisa ser entendido como "00 00 00 05"
- os trigêmeos RGB no bmp são invertidos
Com base no despejo hexadecimal e na documentação, sua imagem armazena cada pixel como um trio RGB não compactado. O primeiro pixel é o triplet 24 1c ed
, mas está invertido, então é hex(ed1c24) que é de fato uma cor vermelha. Observe que há um 00
bloco após cada linha de 5 pixels. A documentação diz que isso é para "alinhamento de bytes".
Portanto, para alterar um pixel de vermelho para azul, você pode alterar um dos trigêmeos de 24 1c ed
para ed 1c 24
.
No que diz respeito ao software, você abriria o arquivo (ou uma cópia) com um Editor Hex, faria as alterações e salvaria. Simplesmente usar um editor de texto no "modo de edição de texto" não é suficiente, pois o símbolo de texto "0" não é igual ao valor numérico binário 0.
O Notepad ++ de código aberto possui capacidade de edição hexadecimal por meio de plug-ins.
Quanto à questão mais ampla de como o Paint cria uma imagem, bem, o programa usa a documentação e os padrões para automatizar o processo. É principalmente uma questão de convenção. O "fluxo de imagens" (dados de pixel) é armazenado e manipulado na memória em umsemelhantemaneira como você vê no arquivo de imagem descompactado.