Maintenant nous allons essayer de charger une image stockée
sur la carte mémoire et l’afficher sur notre écran. Bien entendu, il n’est pas
question d’utiliser une image au format jpeg, gif ou autres qui nécessitent des
routines de conversion plus ou moins complexes. Nous allons nous contenter de
charger une image au format .bmp car chaque pixel de l’image est retrouvé
facilement. Nous allons aussi charger une image de taille réduite qui sera
contenue dans notre écran, ce qui évite aussi d’écrire des routines de
réduction ou de troncature ( mais les courageux pourront réfléchir aux
problèmes que cela soulève ou chercher à utiliser des routines de librairies !!
).
J’ai effectué une copie de l’image en couleurs des 3 cercles
issue d’un programme précèdent (voir chapitre 14) et je l’ai converti au format
bmp par le logiciel Paint sous Windows. J’ai transféré l’image sur le Raspberry
dans le même répertoire que le ce programme.
Dans le programme nous commençons par décrire les structures
des entêtes d’un fichier image au format BMP. Un tel fichier est composé de 4
parties, une entête de fichier, une entête d’image, une description de la
palette qui n’est pas obligatoire (en particulier pour le format 24 bits), et
la suite des octets qui compose l’image à raison de 3 octets par pixel.
Puis dans la fonction principale, nous reprenons exactement
la partie vue précédemment concernant l’ouverture et le traitement du
frameBuffer en remplaçant la sous routine dessin par chargimage.
Dans celle çi, nous ouvrons le fichier image comme nous l’avons
vu dans un chapitre précèdent, nous cherchons la taille du fichier image, pour
vérifier que le buffer de lecture soit assez grand pour contenir les données
que nous lisons par l’appel système READ. Nous vérifions que le type de fichier
est bien bmp (code hexa 4D42) et que la taille de l’image est inférieure à la
taille de l’écran (sinon il faudrait écrire une routine pour tronquer l’image ….).
Maintenant il suffit
de recopier les octets du buffer de lecture vers la zone mémoire du mapping du
frameBuffer pour afficher l’image. Quelques petits problèmes surgissent dus au
format bmp : 1) Nous avons 3 octets pour coder un pixel dans
le fichier et 4 octets pour l’affichage (en 32 bits) 2) une
ligne du fichier doit être un multiple de 4 et donc il nous faut compter des
caractères supplémentaires pour être en phase à chaque ligne 3) l’image étant
plus petite que l’écran, il faut ajouter à chaque ligne la différence pour
rester en phase et 4) il faut commencer par la fin car l’image est inversée !!
Mais tout cela fonctionne après quelques tests et nous retrouvons l’image des 3
cercles colorés.
Exercices :
Ajouter le choix du fichier image à afficher.
Lire une image plus grande que l’écran et la reduire (ou la tronquer)
pour l’afficher
Gérer d’autres formats (8bits 16
bits 32 bits ) si c’est possible
Ou
d’autres formats d’image mais c’est compliqué !!!!