Le but du sujet est de convertir une image entre deux formats possible: PCX et PPM. PPM est un format sans compression. PCX est un vieux format de compression qui n'est plus utilisé, car inefficace.
toto.ppm
de deux façons: d'abord en le
regardant avec la commande display toto.ppm
puis avec la
commande less toto.ppm
. Comprenez ce que vous obtenez.
(Note: les retours à la ligne sont sans importance)
Un fichier PCX
est composé d'une entête de 128 octets suivi de
l'image.
Voici le format de l'entête:
Octets | En Hexa | Contenu | Précisions |
---|---|---|---|
0-3 | 0-3 | Entête | Quatre caractères très particuliers |
4-7 | 4-7 | Entête | Quatre caractères 0 |
8-9 | 8-9 | Longueur | plus exactement longueur - 1 |
10-11 | 10-11 | Hauteur | plus exactement hauteur - 1 |
12-13 | 12-13 | Longueur | |
14-15 | 14-15 | Hauteur | |
65 | 41 | Plans | Toujours 3 |
66-67 | 42-43 | Longueur d'une ligne | Peut être supérieure à la longueur de l'image |
68 | 44 | PaletteInfo | Toujours 1 |
toto.pcx
avec la commande hd -v toto.pcx
. Comprenez ce que vous obtenez.
Les caractères suivants du fichier correspondent à l'image. L'image est codée ligne par ligne, chaque ligne étant codée en décrivant entièrement sa composante rouge, puis entièrement sa composante verte, puis entièrement sa composante bleue.
Le codage fonctionne de la manière suivante: Si un caractère est de valeur (strictement) inférieure à 192, c'est qu'il s'agit directement de la couleur d'un pixel. Sinon, on retranche 192 au résultat, et on obtient le nombre de fois où il faut répéter le caractère suivant.
Regardons par exemple le fichier toto.pcx avec la commande
od -v -Ad -tu1z toto.pcx
On y observe la séquence suivante:
194 0 139 141 140 139 107 210 0 132 195 140 141 194 0 194
Le 194 signifie qu'il faut recopier 2 fois le caractère 0, puis il faut recopier une fois les caractères 139, 141, 140, 139, 107, puis 210-192=18 fois le caractère 0, etc.
toto.ppm
.
toto.pcx
puis sur test.pcx
.
Quelques conseils se trouvent en fin de document.
Dans tous les TPs de compression, il n'est pas nécessaire de faire de malloc
. Vous pouvez supposer que toutes les images que vous avez lire auront moins de 2000 lignes et 2000 colonnes.
Pour lire le fichier, il est conseillé d'utiliser fopen, et d'utiliser
fgetc pour lire caractère par caractère. Un exemple est donné dans le fichier toto.c
.
Si vous lisez des caractères (par exemple l'entête) dans un tableau de
caractères, faites attention que la variable soit de type unsigned char buffer[512]
et non pas char buffer[512]
sans quoi votre
tableau sera constitué d'entiers signés (entre -128 et 127) plutôt que
d'entiers non signés (entre 0 et 255).
Lorsqu'on demande de convertir un fichier ppm en fichier pcx, vous allez utiliser fread ou fscanf pour lire le fichier ppm et fputc pour écrire octet par octet dans le fichier pcx.