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.

Fichiers

Q1 Regardez le fichier 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
Q2 Regardez le fichier 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.

Q3. Vérifiez que vous avez compris ce qui est écrit au dessus. En particulier vérifiez que les caractères dont on parle se retrouvent dans le fichier toto.ppm.
Q4. Ecrivez un programme qui transforme un fichier pcx en un fichier ppm. Vous pourrez le tester sur toto.pcx puis sur test.pcx. Quelques conseils se trouvent en fin de document.
Q5. Ecrivez un programme qui transforme un fichier ppm en un fichier pcx.
Q6. Expliquer comment cacher un texte dans un fichier pcx: le texte n'est pas visible quand on regarde l'image, mais, équipé du bon programme, un utilisateur pourra le récupérer. Modifier le programme précédent pour y cacher le texte "ornithorynque". (Aide: que représente la séquence 45 92 192 32 192 52 ?)

Conseils

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.