> Tech > Créer une image bitmap

Créer une image bitmap

Tech - Par Renaud ROSSET - Publié le 24 juin 2010
email

Nous avons vu au début de cet article que les PC utilisent des fichiers stream pour différentes choses : images, vidéos et son. Vous pourriez par exemple créer une image bitmap contenant un histogramme représentant les ventes de votre société. En raison de la place limitée dans cet article, je

ne fournis ici qu’un exemple simple : une image bitmap qui trace une ligne sur la largeur de l’image. Si vous voulez aller plus loin et tracer des lignes qui constituent un graphique, ce sera un excellent exercice.

Le nom officiel de ce type d’image est un fichier DIB (device-independent bitmap) Microsoft Windows. Ces fichiers stream bitmap présentent généralement une extension de fichier .bmp. Les fichiers bitmap se composent de quatre parties : un en-tête de fichier, un en-tête d’information bitmap, une palette de couleurs, et les données d’image en binaire.

L’en-tête de fichier est une structure de données qui contient des informations générales sur le fichier proprement dit. La figure 7 montre une définition RPG de cette structure de données.

L’en-tête d’information bitmap est une structure de données qui contient les champs qui identifient les données stockées dans l’image bitmap ellemême. La figure 8 montre cette structure de données. Les champs biHeight et biWidth indiquent combien de pixels en hauteur et en largeur constituent les données d’image quand elles s’affichent sur l’écran. Le champ biBitCount indique combien de bits de données servent à représenter chaque pixel. Cette valeur influence directement le nombre de couleurs dont on dispose. Ainsi, si chaque pixel de l’image peut afficher jusqu’à 256 couleurs différentes, le champ biBit- Count devrait être mis à 8 pour qu’il y ait 256 valeurs possibles pour chaque pixel. Cela détermine aussi la quantité d’espace disque qu’occupe l’image parce, pour chaque pixel écrit, vous devez stocker ce nombre de bits sur disque. S’il y a huit bits par pixel, chaque pixel de l’image occupe un octet entier sur disque. Le champ biClrUser indique le nombre d’entrées dans la palette de couleurs.

La palette de couleurs est une matrice de définitions de couleurs. Chaque entrée dans la matrice associe la valeur numérique de chaque pixel dans l’image à une couleur affichable sur l’écran. Si l’on spécifie huit bits par pixel, chaque pixel dans le bitmap peut avoir une valeur de 0 à 255. Si, par exemple, un pixel a une valeur de 19, il correspond à l’élément 19 de la matrice de palette de couleurs. Cet élément a une valeur de couleur RGB (Red, Green, Blue) que Windows affiche sur l’écran. La figure 9 montre la structure de chaque entrée de la matrice de palette de couleurs.

Les données de l’image bitmap constituent une matrice bidimensionnelle de pixels. On l’a vu, la taille de chaque entrée dans cette matrice est différente, selon le nombre de bits par pixel que l’on a spécifié dans l’en-tête d’information bitmap. Dans cet exemple, j’ai utilisé huit bits par pixel, donc chaque entrée dans la matrice a huit bits (un octet) de long. La taille de la matrice dépend des valeurs height (hauteur) et width (largeur) qui ont été spécifiées dans l’en-tête d’information bitmap. Dans mon exemple, j’ai un bitmap de 500 pixels de haut et 400 pixels de large, soit une matrice de 20 000 pixels. Les 400 premiers pixels représentent la première ligne (ou rangée) de l’image, les 400 suivants représentent la deuxième ligne, et ainsi de suite.

La figure 10 montre des fragments du programme qui crée le fichier stream bitmap. Il commence par calculer la quantité de mémoire dont il a besoin pour stocker le bitmap (A en figure 10). Ensuite, il alloue la mémoire nécessaire et utilise l’API memset() pour effacer la mémoire et la remplir de zéros (B en figure 10). Un pointeur de base pointe sur chaque structure de données requise à la mémoire nouvellement allouée (C en figure 10), de telle sorte que, quand je changerai les valeurs des structures de données, les changements seront stockés dans la mémoire qui a été allouée précédemment.

L’iSeries et le PC stockent les entiers de manière différente. L’iSeries stocke d’abord l’octet le plus significatif d’un entier, suivi de l’octet le plus significatif suivant, et ainsi de suite. Cet ordre de stockage est ce que l’on appelle le format « big endian ». Par exemple, l’iSeries stocke un entier de quatre octets qui contient la valeur décimale 4531 sous la forme x’000011B3′. En revanche, le PC stocke les octets dans l’ordre inverse et, par conséquent, stocke cette même valeur décimale 4531 sous la forme de x’B3110000′. Cet ordre de stockage est appelé format « little endian ». Comme l’image bitmap doit être compatible avec Windows, le programme exemple « bascule » les bits de chaque entier avant d’écrire la valeur dans le fichier.

Pour basculer (flip) les entiers non signés et signés, j’ai écrit les sous-procédures flipUns() et flipInt(). (Par manque de place, la figure 10 ne montre pas ces routines. Cependant, le code téléchargeable de cet article, disponible à iSeries- Network.com/code, inclut ces sous-procédures). En D de la figure 10, ces sous-procédures peuplent les deux structures de données d’en-tête si nécessaire.

La palette de couleurs, une matrice de structures de données RGBQUAD, est créée dans la matrice appelée palette (E en figure 10). Pour faciliter le peuplement de cette matrice, j’ai écrit une sous-procédure appelée RGB pour générer ces structures de données (H en figure 10).

Je rappelle que, à titre de démonstration, je trace une ligne de couleur cyan sur la largeur des données de l’image bitmap. Pour cela, je donne la valeur 19 à la couleur de chaque pixel des lignes 248 à 252 de l’image. Comme l’entrée 19 de la palette de couleurs est cyan, c’est cette couleur qui sera tracée (F en figure 10). La sous-procédure setPixel- Color() (I en figure 10) utilise la logique du pointeur pour trouver le pixel correct dans la matrice des données d’image bitmap et définit la valeur correspondante. Les entrées de la palette de couleurs sont numérotées à partir de zéro, de sorte que la valeur réelle attribuée au pixel est inférieure de un à celle que j’ai transmise. Comme j’ai utilisé l’API memset() pour tout mettre à zéro auparavant, tout ce que je ne définis pas avec la routine setPixelColor() utilisera la première entrée de la palette de couleurs, c’est-à-dire le noir.

Une fois que toutes les valeurs de pixels ont été définies en mémoire, j’écris la mémoire dans le fichier stream (G en figure 10). Pour tester le bitmap, utilisez FTP pour le transférer sur votre PC. Comme il s’agit d’un fichier stream binaire, veillez à bien utiliser le mode binaire dans FTP ! Faute de quoi, le système estimera que les caractères du fichier sont des caractères EBCDIC et essaiera de les traduire en ASCII.

Pour dessiner un histogramme au lieu de tracer une simple ligne cyan, il suffit d’ajouter quelques boucles de programme. Si le coeur vous en dit, c’est un excellent exercice.

Téléchargez cette ressource

Guide de Sécurité IA et IoT

Guide de Sécurité IA et IoT

Compte tenu de l'ampleur des changements que l'IA est susceptible d'entraîner, les organisations doivent élaborer une stratégie pour se préparer à adopter et à sécuriser l'IA. Découvrez dans ce Livre blanc Kaspersky quatre stratégies efficaces pour sécuriser l'IA et l'IoT.

Tech - Par Renaud ROSSET - Publié le 24 juin 2010