Génération d'images en langage C (généralités)

Certaines pages de ce site contiennent des bargraphes qui montrent l'état d'avancement de la vaccination à ce jour pour diverses tranches de la population triées en fonction d'un critère particulier et pour chaque dose de vaccin.

D'autre pages contiennent des graphiques qui montrent l'évolution de la vaccination dans le temps depuis janvier 2021, toujours pour diverses tranches de la population triées en fonction des mêmes critère.

Sur ce site, bargraphes et graphiques sont des images qui sont générées lors de l'exécution d'un programme C lancé depuis l'interpréteur PHP.

L'un des programmes génère la série de bargraphes dans lequel la population est triée selon un critère dépendant du fichier CSV local choisi, l'autre une série de graphiques pour lesquels la population est triée selon les même critères.

Choix du format d'images

Pour réaliser des images, plusieurs formats sont possibles parmi lesquels :

bmp C'est un format de fichier ancien à la structure simple qui permet aussi bien de stocker des photos en couleur (avec des millions de teintes possibles) que des dessins ou graphiques qui se limitent à quelques couleurs ou quelques dizaines de couleurs.

Les images pouvant comporter des millions de couleurs ne sont pas compressées, ce qui donne des fichiers volumineux.

Les versions en 2 couleurs, jusqu'à 16 couleurs et jusqu'à 256 couleurs (ou niveaux de gris) donnent des fichiers moins volumineux et dans ce cas, il existe un mode de compression rudimentaire (donc facile à programmer) certainement peu efficace pour des photos en niveaux de gris mais peut-être intéressant pour des graphiques.
png Comme le format bmp, il permet aussi bien de mémoriser des photos avec des millions de couleurs ou des images qui se limitent à quelques couleurs ou quelques dizaines de couleurs.

Il utilise un algorithme de compression efficace (tout particulièrement pour les images ne dépassant pas 256 couleurs) mais qu'il serait compliqué de récrire. On a donc recours à des bibliothèques de fonctions qui font le travail.
gif Le format d'images gif est limité à 256 couleurs (ce qui est largement suffisant pour des graphiques). C'est un format qui est aujourd'hui dans le domaine public.

Handicapé au début du siècle du fait qu'il était soumis à des brevets, le format png l'a supplanté sur internet pour les images fixes. Il offre par contre la possibilité de réaliser des images animées.
jpeg C'est un format créé pour mémoriser des photographies (soit avec des millions de couleurs, soit avec 256 niveaux de gris).

Pour ce type d'utilisation c'est le format d'image qui donne les fichiers les moins encombrants et pour une même image, on peut obtenir plusieurs tailles de fichiers en définissant un niveau de qualité.

Dans le cas d'images avec seulement quelques couleurs, c'est un format à éviter : d'une part les fichiers obtenus seront plus volumineux qu'au format png, d'autre part, la compression jpeg va introduire des défauts au niveau des contours.

Pour réaliser les bargraphes et les graphiques de ce site, c'est le format bmp dans sa version pour 3 à 16 couleurs qui a été choisi.

Il permet de réaliser des bargraphes de 12670 octets. Pour les graphiques, leur taille dépend de la durée représentée (33 k octets pour 11 mois, 38 pour 12 mois 1/2).
Les rectangles de couleur uniforme (bmp prévu pour 2 couleurs) utilisés dans le choix du menu "Par classe d'âge (1)" occupent eux seulement 2618 octets.

Bien qu'on ferait beaucoup mieux avec le format png, ces tailles de fichiers sont très raisonnables pour un site web actuel.

La version initiale de ce site produit des fichiers bmp non compressés. Toutefois, en utilisant la compression rle, on peut espérer réduire encore fortement la taille de ces fichiers.

Décomposition des fichiers source C

On l'a déjà dit, deux programmes C sont utilisés pour fabriquer la plupart des images de ce site, l'un pour les bargraphes, l'autre pour les graphiques.

Certaines opération à réaliser sont communes aux deux programmes. On les met donc dans des fichiers distincts qui seront utilisés par les deux programmes.

Une première bibliothèque de fonctions sert à extraire du fichier CSV local les information utiles. Une autre fonction sert à créer l'entête standardisée d'un fichier contenant une image au format bmp.

Ça donne les fichiers suivants :

trtchamps.c
trtchamps.h
Fonctions permettant d'accéder aux champs d'un fichier CSV local
entete-bmp.c
entete-bmp.h
Fonction permettant d'initialiser l'entête d'un fichier image bmp

Ensuite pour chacun des programmes, il y a :
Dans le cas des bargraphes, ça donne les fichier suivants :

gen-serie-bargraphes.c Génération d'une série de bargraphes à partir d'un fichier CSV local
genbargraphe.c
genbargraphe.h
Génération d'une image bmp représentant un bargraphe
bargraphe.h Constantes définissant les caractéristiques d'un bargraphe

et dans le cas des graphiques :

gen-serie-graphiques.c Génération d'une série de graphiques à partir d'un fichier CSV local
gengraphe.c
gengraphe.h
Génération d'une image bmp représentant un graphique
graphe.h Constantes définissant les caractéristiques d'un graphique