Como criar uma imagem bitmap com “caneta e papel”?

0

Este é o hex dump de um bitmap 5x5 colorido com a cor vermelha:

A 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 cor para esse assunto?

Em extensão, como ferramentas como o Paint convertem os pixels que você desenha em hexadecimal para salvar o bitmap?

    
por P. Ktinos 20.10.2016 / 19:03

1 resposta

2

Veja a documentação do BMP: link

A forma abreviada é:

  • 14 bytes de cabeçalho BMP (informações sobre o arquivo)
  • cabeçalho DIB de 40 bytes (informações da imagem)
  • pixels

Você pode ver na seção do cabeçalho DIB os dois valores 5 para as dimensões em pixels e um valor de 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 ao que você tem aqui. Algumas notas:

  • um byte, visualmente, é um par 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 um hex (10) = dec (16). Você pode usar a calculadora do Windows definida para "modo de programador" se precisar de ajuda para converter.
  • "ordem de bytes" é baixa a alta, então um valor de 4 bytes de "05 00 00 00" precisa ser entendido como "00 00 00 05"
  • os trios RGB no bmp são invertidos

Com base no dump hexadecimal e na documentação, sua imagem está armazenando cada pixel como uma tríade RGB não compactada. O primeiro pixel é o tripleto 24 1c ed , mas isto é invertido, então é hexadecimal (ed1c24) qual é de fato uma cor vermelha. Observe que há um 00 pad após cada linha de 5 pixels. A documentação diz que isso é para "alinhamento de bytes".

Para alterar um pixel de vermelho para azul, você pode alterar um dos trios de 24 1c ed para ed 1c 24 .

Em relação ao software, você abriria o arquivo (ou uma cópia) com um Editor Hex, faria as alterações e salvaria-o. Simplesmente usar um editor de texto em "modo de edição de texto" não é suficiente, pois o símbolo de texto "0" não é o mesmo que o valor numérico binário de 0.

O open source Notepad ++ tem capacidade de edição hexadecimal via plugins.

Em relação à grande questão de como o Paint faz uma imagem, o programa usa a documentação e os padrões para automatizar o processo. É principalmente uma questão de convenção. O "fluxo de imagem" (dados de pixel) é armazenado e manipulado na memória de uma maneira similar como você vê no arquivo de imagem descompactado.

    
por 20.10.2016 / 20:13