1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
| /* Inclusions des bibliothèques contenant les prototypes des fonctions standard de C */
#include <stdio.h>
#include <stdlib.h>
/* Définition de constantes globales */
#define MOT 2 /* nombre d'octet dans un mot */
/* Définition des prototypes des fonctions ou sous-programmes codés par l'utilisateur : informe le compilateur de la syntaxe attendue pour ce sous-programme */
void lecture_ecriture_image(short int *image, int cote, char *nom1, char *nom2, int option);
/* si option vaut 0, lit sur le disque l'image dicom nommée nom1 puis stocke en mémoire les cote² valeurs des pixels à partir du pointeur image*/
/* si option vaut 1, écrit sur le disque une image dicom nommée nom2 contenant l'entete du fichier nom1 puis les cote² valeurs des pixels stockés à partir du pointeur image */
void message(char *information); /* renvoie à l'écran un message */
/*---------------------------------------------------------------------------------------------------------------------------------------------*/
/* Programme principal */
/*---------------------------------------------------------------------------------------------------------------------------------------------*/
int main() /* Programme principal */
{
int i,j,ki, kj; /* variable entières signées: indices de boucles */
int cote; /* taille de l'image en pixels par cote */
char nom[256], nom1[256], nom2[256]; /* chaines de caractères via pointeurs sur les noms des fichiers images lus sans entete, avec entete dicom et écrits en sortie */
char information[2048]; /* message à afficher a l'utilisateur */
short int *image;
short int *image2 ; /* pointeur sur les valeurs de pixels contenues dans le fichier image dicom, sur 2 octets */
short int *tampon ; /* pointeur sur les pixels de l'image en cours de filtrage, codes sur 1 mot */
/**************************************************************************************************************************************************/
/* Ouverture du fichier contenant limage */
printf("\nEntrez le nom du fichier image dicom a ouvrir : "); /* affiche un texte à l'écran, pour information */
scanf("%s",nom); /* affecte la chaine de caractères tapée au pointeur nom */
sprintf(nom1,"%s.dcm",nom); /* concatène nom et .dcm dans nom1*/
printf("\nEntrez la taille de cette image (nombre de pixels par cote) : ");
scanf("%d",&cote); /* affecte le nombre entier entré à l'adresse pointée par &cote*/
/* Affectation de la mémoire vive nécessaire au stockage des pixels de l'image */
image = malloc(cote*cote*sizeof(short int)) ; /* Allocation de taille_dicom mots de 2 octets à partir de *dicom */
if(image==NULL)
{
sprintf(information, "Erreur : Allocation du fichier dicom impossible lors de sa lecture\n");
message(information);
}
/* Lecture de l'image dicom sur le disque dur et affectation des valeurs des pixels au pointeur image */
lecture_ecriture_image(image,cote,nom1,nom1,0);
//tampon = (short *)malloc(4*cote*2*sizeof(short int))
/* Ecriture sur le disque d'une image dicom contenant l'entete du fichier nom1 puis les cote² valeurs des pixels stockés à partir du pointeur image sur 2 octets */
sprintf(nom2,"%s-filtre.dcm",nom); /* nom du fichier en sortie */
lecture_ecriture_image(image,cote,nom1,nom2,1);
/* libération de mémoire */
free(image);
sprintf(information,"\nLe fichier %s a ete ecrit dans le repertoire courant avec succes.\nFin du programme (tapez sur une touche pour fermer)\n",nom2);
message(information);
}
/*---------------------------------------------------------------------------------------------------------------------------------------------*/
/* A partir d'ici, nous définissons les fonctions et programmes utilisées dans le programme princupal */
/*---------------------------------------------------------------------------------------------------------------------------------------------*/
void lecture_ecriture_image(short int *image, int cote, char *nom1, char *nom2, int option)
{
FILE *fichier ; /* structure identifiant un fichier */
short int *dicom ; /* pointeur sur le fichier image dicom complet, avec ses entetes, sur 2 octets : ces données ne seront connues que dans cette fonction*/
int taille; /* taille du fichier image dicom */
int entete; /* entier contenant le nombre de mots dans l'entete dicom */
int i,j,l,c; /* entiers servant à balayer les pixels de l'image suivant lignes et colonnes */
char information[2048]; /* message à afficher a l'utilisateur */
/* Définition d'un pointeur sur le fichier présent dans le disque dur */
fichier=fopen(nom1,"rb") ; /* ouvre le fichier nom1 sur le disque en lecture */
if(fichier==NULL) /* avertissement et sortie en cas de lecture impossible */
{
sprintf(information, "Erreur : le fichier %s n'est pas lisible dans le repertoire courant\n",nom1); /* fabrique la chaine de caractères "message" */
message(information); /* appel à la fonction qui affiche le message */
}
/* Calcul de la taille du fichier dicom contenant l'image */
fseek(fichier,0,SEEK_END); /* Déplacement du pointeur du fichier en fin de fichier */
taille = ftell(fichier); /* La fonction ftell renvoie la position courante en octet du pointeur de fichier */
/* par rapport au début du fichier, donc ici la taille du fichier */
taille/=MOT; /* calcul de la taille du fichier dicom en mots de 2 octets */
/* Calcul de la taille de l'entête unique en début de fichier */
entete = taille - cote*cote; /* calcul de la taille de l'entête du fichier dicom en mots de 2 octets */
/* Allocation dun pointeur sur le fichier image dicom complet */
dicom = malloc(taille*sizeof(short int)) ; /* Allocation locale de taille_dicom mots de 2 octets à partir de *dicom */
if(dicom==NULL)
{
sprintf(information, "Erreur : Allocation du fichier dicom impossible lors de sa lecture\n");
message(information);
}
fseek(fichier,0,SEEK_SET); /* rembobinage */
fread(dicom,taille,sizeof(short int),fichier) ; /* affectation de la mémoire vive allouée par lecture de nom1 */
fclose(fichier) ; /* libération du pointeur de fichier */
/* Lecture ou écriture, suivant la valeur de l'option */
short * tampon = (short *)malloc(4*cote*sizeof(short));
//"l" compteur de ligne//
for (l=0;l<cote;l++)
{
/* decalage buffer entree pour ligne courante */
int decalage_entree = entete + l * cote;
//"c" compteur de colonne//
for (c=0;c<cote;c++)
//facteur zoom *4//
for (i=0;i<4;i++)
tampon[c*4+i] = dicom[decalage_entree+c];
for (i=0;i<4;i++)
fwrite(tampon,4*cote,sizeof(short),fichier);
}
//fread(dicom-entete,taille,sizeof(short int),fichier);
/* puis on écrit sur le disque dur le nouveau fichier dicom produit */
fichier=fopen(nom2,"wb") ; /* pointeur sur le fichier à écrire sur le disque */
if(fichier==NULL)
{
sprintf(information,"Erreur : le fichier %s ne peut pas etre ecrit dans le répertoire courant\n",nom2);
message(information);
}
fseek(fichier,-0,SEEK_SET); /* positionnement en début de fichier */
fwrite(dicom,taille,sizeof(short int),fichier) ; /* écriture du pointeur dans le fichier nom2 */
fclose(fichier) ; /* libération du pointeur de fichier */
}
/*---------------------------------------------------------------------------------------------------------------------------------------------*/
void message(char *information)
{
printf(information); /* affiche à l'écran le message d'information */
getch(); /* attente d'une frappe clavier pour que l'utilisateur prenne connaissance du probleme */
exit(1) ; /* sort du programme */
}
/*---------------------------------------------------------------------------------------------------------------------------------------------*/ |