COMMENT CREER UNE LIBRAIRIE POUR Tcl ? (Partie 2) Cette partie va aborder l'écriture proprement dite de fonctions de traitement d'images dans une librairie pouvant être appelée depuis un script Tcl. Nous montrerons aussi comment utiliser efficacement notre extension depuis l'environnement graphique AUDACE (raapelons que ce dernier programme est écrit entièrement en Tcl et en Tk). Nous allons travailler deux fonctions. L'une ajoute une constante à tous les pixels d'une image. L'autre effectue le fenêtrage interactif d'une zone de l'image. Les noms de commande respectifs de ces fonctions vues par l'utilisateur sont qm_offset et qm_window. Ajoutez un nouveau fichier de code depuis l'environnement de programmation (voir la première partie de ce tutorial). Nommez ce fichier qtit1.cpp. Voici le code qu'il contient : // Projet :
AudeLA #include "libqm.h" /*********************
OFFSET ********************/ if (p==NULL) return(PB); taille=(int)imax*jmax; for (i=0;i<taille;i++) return(OK); /************
CALC_WINDOW ****************/ if (x1==-999) return(PB); ptc=0; return(OK); Considérons la fonction offset. Les paramètres tous d'abord :
Après que l'on ai vérifier
que le pointeur image est bien valide (c'est à dire qu'il
pointe bien vers une zone mémoire valide), on détermine
la dimension de l'image (variable TAILLE). Rappelez-vous qu'il est nécessaire
de déclarer la fonction offset dans le fichier libqm.h (nous l'avons déjà fait dans la partie
1 du présent tutorial) : int offset(short cst,short imax,short jmax,float *p); Ecrivons à présent la fonction CmdOffset dans le fichier qmtcl1.cpp. Cette fonction réalise le décodage des paramètres entrés par l'utilisateur : /*************************
CmdOffset ***********************/ if (argc!=2) if (get_image_info(&image,1,interp)==TCL_ERROR) if (offset((short)atoi(argv[1]),imax,jmax,p)==PB) SetResult(interp,"OK",TCL_VOLATILE);
On contrôlez tout d'abord que l'utilisateur à bien fourni le nombre correct d'arguments (ici il y a un seul argument, la valeur de l'offset, mais rappelez-vous qu'il faut aussi comptabiliser le nom de la fonction) : if (argc!=2) On appelle ensuite la commande get_image_info qui, comme son nom l'indique, retourne des informations sur l'image actuellement en mémoire. Cette fonction, bien pratique, sera décrite plus tard. Les informations utiles sont l'adresse mémoire de l'image, ces dimensions et la valeur courante des seuils de visualisation. Il est important de préciser ici qu'il est supposé que l'image a été stockée dans la mémoire (chargée depuis le disque si on préfère) avec les outils fourni dans la bibliothèque Audela. Le processus et toutes les initialisations nécessaires sont automatiquement réalisées si vous utilisez par exemple l'interface AUDACE. if (get_image_info(&image,1,interp)==TCL_ERROR) La fonction de calcul d'offset est ensuite appelée : if (offset((short)atoi(argv[1]),imax,jmax,p)==PB) On finit l'exécution en retournant une chaîne ('"OK") qui s'affichera à l'écran à la fin du calcul (s'il n'y a pas d'erreurs). Tcl_SetResult(interp,"OK",TCL_VOLATILE);
} |