Année universitaire 2002-2003 |
Licence d'informatique
|
On souhaite transformer l'image couleur enregistrée dans le fichier /users/linfg/linfg0/ICONE/image_RVB.ppm en une image en niveaux de gris, puis écrire cette nouvelle image dans un fichier de nom image_NB.ppm. Pour cela, on utilisera les fonctions fscanf et fprintf (déjà présentées lors de la séance 2 de travaux pratiques) ainsi que les fonctions fread, fwrite, fseek et feof (déjà présentées lors de la séance 6 de travaux dirigés).
Une image au format ppm constitue un fichier partiellement de texte et partiellement binaire. Son en-tête est composé de caractères. La suite est constituée des valeurs binaires des intensités de chaque pixel de l'image, dans les trois canaux R (rouge), V (vert) et B (bleu). Chacune de ces intensités est codée sur un octet, donc a une valeur entière comprise entre 0 et 255.
On conseille de procéder comme suit :
1) Copier le fichier /users/linfg/linfg0/ICONE/image_RVB.ppm dans le répertoire courant, à l'aide de la commande :
2) À l'aide de la fonction fopen, ouvrir ce fichier en lecture, en mode texte. Commencer par lire une chaîne de caractères ch. Si cette chaîne n'est pas égale à P6, afficher sur stderr le message L'image n'a pas le format requis. Sinon, afficher sur stderr le message L'image a bien le format requis, puis lire dans le fichier deux entiers nb_colonnes et nb_lignes, de type int, dont les valeurs désignent, dans l'ordre, le nombre de colonnes et le nombre de lignes de l'image. Lire enfin un entier max, dont la valeur désigne la valeur maximale des intensités dans les trois canaux. Stocker le nombre de caractères lus dans la variable nb_car, à l'aide de l'instruction suivante :
où id_fich est l'identificateur du fichier image_RVB.ppm. Fermer ce fichier.
3) Ouvrir le fichier image_NB.ppm en écriture, en mode texte, et y écrire, en respectant scrupuleusement cet ordre :
Fermer ce fichier.
4) Ouvrir le fichier image_RVB.ppm en lecture, en mode binaire, et se placer après le nb_car+1ème octet (nombre de caractères de l'en-tête lus à l'étape 2, plus le dernier caractère de l'en-tête, un retour-chariot, qui n'avait pas été lu). Ouvrir le fichier image_NB.ppm en écriture, en mode "ab". Tant qu'on peut lire trois octets dans le fichier image_RVB.ppm, calculer la moyenne (arrondie) de ces trois entiers, et l'écrire dans le fichier image_NB.ppm. Fermer ces deux fichiers.
Il est possible de lancer un programme exécutable, issu d'un programme source écrit en C, en lui passant des paramètres au moment de l'appel, comme cela est le cas pour la plupart des commandes UNIX.
Supposons que mnt soit un programme exécutable,
obtenu par la compilation puis l'édition de liens du fichier mnt.c
Pour passer les trois paramètres 12, 5
et chaîne au programme mnt, on lance ce
programme de la façon suivante :
> mnt 12 5 chaîne |
Pour récupérer les paramètres passés au moment de l'appel à un programme en C, il faut déclarer le programme principal avec deux arguments selon l'une des deux syntaxes équivalentes suivantes :
int main(int argc,char **argv)
int main(int argc,char *argv[])
Dans l'exemple d'appel donné ci-dessus, argc vaut 4, et :
On peut également dessiner la représentation en mémoire (cf. la séance 3 de travaux dirigés) correspondant à cet exemple :
Les valeurs de ces paramètres peuvent alors être réutilisées à l'intérieur du programme. Il est parfois nécessaire de convertir certains de ces paramètres en valeurs numériques. Dans l'exemple précédent, il sera nécessaire de convertir les chaînes de caractères "12" et "5" en entiers de valeurs 12 et 5
Modifier le programme réalisé dans l'exercice 1, de manière à passer les fichiers image_RVB.ppm et image_NB.ppm en paramètres, à l'appel du programme.
Modifier le programme précédent, de manière
à intégrer une macro-instruction qui effectue un "seuillage".
On définit pour cela une "constante de seuillage" S1
valant 100
Pour une valeur v donnée :
La macro-instruction sera appliquée à chaque valeur moyenne calculée dans l'exercice 1. Le résultat du test sera sauvegardé dans un nouveau fichier résultat, de nom image_NB_2.ppm
Modifier le programme précédent, de telle sorte qu'il procède de la manière suivante :
Dans un premier temps, S2 et S3 seront déclarées en constantes. Ensuite, ces deux constantes de seuillage seront passées en paramètres à l'appel du programme. On écrira alors une fonction conversion, qui convertit une chaîne de caractères composée uniquement de chiffres, en un entier. Enfin, on testera le programme avec S2 et S3 valant respectivement 1 et 10.