vendredi 26 janvier 2018

Chapitre 17 : afficher une image au format BMP



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é !!!!

Aucun commentaire:

Enregistrer un commentaire