Comment créer une image bitmap avec «stylo et papier»?

0

Voici le vidage hexadécimal d'un bitmap 5x5 coloré en rouge:

entrez la description de l'image ici

Ma question est la suivante: comment puis-je modifier uniquement les valeurs hexadécimales (sans utiliser un outil tel que Paint) afin de modifier la couleur du bitmap, par exemple, la couleur verte (0,255,0)ou une couleur quelconque?

Dans la mesure du possible, comment des outils tels que Paint convertissent-ils les pixels dessinés en hexa pour enregistrer le bitmap?

P. Ktinos
la source

Réponses:

1

Voici la documentation pour BMP: https://en.wikipedia.org/wiki/BMP_file_format#Pixel_array_.28bitmap_data.29

Le formulaire court est:

  • 14 octets en-tête BMP (informations de fichier)
  • En-tête DIB de 40 octets (informations d'image)
  • pixels

Vous pouvez voir dans la section d'en-tête de la DIB les deux valeurs 5 pour les dimensions en pixels et une valeur hexadécimale (18) pour la couleur 24 bits (RVB).

L’exemple 1 du wiki qui présente un dump HEX pour une image 2x2 semblable à celle que vous avez ici est particulièrement intéressant. Quelques notes:

  • visuellement, un octet est un couplet à deux chiffres (le premier octet de votre image est 42).
  • le comptage commence à 0, donc "offset 31" est le 32ème octet.
  • les nombres sont tous HEX, donc un hex (10) = dec (16). Vous pouvez utiliser la calculatrice Windows configurée en "mode programmateur" si vous avez besoin d'aide pour convertir.
  • "ordre d'octet" est faible à élevé, donc une valeur de 4 octets "05 00 00 00" doit être comprise comme "00 00 00 05"
  • les triplets RVB du bmp sont inversés

Sur la base du vidage hexadécimal et de la documentation, votre image stocke chaque pixel sous forme de triplet RVB non compressé. Le premier pixel est le triplet 24 1c ed, mais celui-ci est inversé. Il s’agit donc de l’hex (ed1c24) qui est en effet de couleur rouge. Notez qu'il y a un 00pavé après chaque ligne de 5 pixels. La documentation indique qu'il s'agit d'un "alignement d'octets".

Donc , pour changer un pixel du rouge au bleu, vous pouvez modifier l' un des triplés de 24 1c edà ed 1c 24.

En ce qui concerne les logiciels, ouvrez le fichier (ou une copie) avec un éditeur hexadécimal, apportez les modifications et enregistrez-le. Utiliser simplement un éditeur de texte en "mode d'édition de texte" ne suffit pas, car le symbole de texte "0" n'est pas identique à la valeur numérique binaire de 0.

Open Source Notepad ++ a une capacité d'édition hexadécimale via des plugins.

En ce qui concerne la question plus générale de la façon dont Paint crée une image, le programme utilise la documentation et les normes pour automatiser le processus. C'est surtout une question de convention. Le "flux d'images" (données de pixels) est stocké et manipulé en mémoire de la même manière que dans le fichier image non compressé.

Yorik
la source
Oh tu as raison. J'étais confus au début, car 1) des valeurs aléatoires "00" et 2) des valeurs de couleur hexagonales inversées, mais en utilisant un éditeur hexadécimal, j'ai remplacé tous les "24 1C ED" par "00 FF 00" pour échanger l'image. et mon exemple d’objectif (changer la couleur du rouge au vert) a été atteint. Merci.
P. Ktinos
Aucun problème. Les documents disent quelque chose à propos de "remplissage pour l'alignement sur 4 octets" et d'une ligne complète de 5 pixels plus un remplissage sur 16 octets = 16 octets (ou 4 ensembles de 4). La quantité de remplissage va donc varier de 0 à 3 octets.
Yorik
ils appellent l'octet de commande "endianness". Je crois que l'exemple ici est "Little Endian". Si je me souviens bien, l’endianisme était un problème de réutilisation de code entre l’ancien Mac et l’ancien conceptions de PC, qui empêchait les utilisateurs de prendre le temps de créer des logiciels multi-plateformes.
Yorik