Code de traitement d'image en C

Fermé
nihad27 - 12 janv. 2008 à 22:43
mariostar27 Messages postés 391 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 21 août 2015 - 5 nov. 2009 à 16:31
Salut , j'ai un code de traitement d'image ke je dois comprendre mais je me suis bloquée au debut car j'ai pas compris qu'est ce qu'on veut programmer .
voici le code j'espere que vous m'aidez
merci


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct IMAGE
{
char *Nom ;
char Format[3] ;
char Ext[5] ;
int w ;
int h ;
int nbcol ;
int * G ;
int * R ;
int * V ;
int * B ;
int valide ;
};

typedef struct IMAGE img ;

img **TabImg = NULL ;
int NbrImg = 0 ;

FILE * pfi = NULL ;

char * stringlower(char *str)
{
int lg = strlen(str) ;
char * ch = (char*)malloc(sizeof(char)*(lg + 1)) ;
int cpt ;
for(cpt = 0 ; cpt < lg ; cpt++)
{
if((str[cpt]>= 'A') && (str[cpt]<= 'Z'))
ch[cpt] = str[cpt] - ('A' - 'a');
else
ch[cpt] = str[cpt] ;
}
ch[cpt] = '\0' ;
return ch ;
}

FILE * ImageOpen(char *nom)
{
FILE * pfi = fopen(nom, "rb") ;
return pfi ;
}

void ImageClose(FILE *pfi)
{
fclose(pfi) ;
}


int ExtensionSet(char *nom, img *image)
{
int cpt, i = 3 , lg = strlen(nom) ;

image->Ext[4] = '\0' ;

for(cpt = lg - 1 ; cpt > lg - 5; cpt--)
{
image->Ext[i--] = nom[cpt] ;
}

if(strcmpi(image->Ext, ".ppm") == 0)
{
strcpy(image->Format,"P6") ;
image->Nom = (char*)malloc(sizeof(char)*(lg+1)) ;
strcpy(image->Nom, nom) ;
return 1 ;
}
else if(strcmpi(image->Ext, ".pgm") == 0)
{
strcpy(image->Format,"P5") ;
image->Nom = (char*)malloc(sizeof(char)*(lg+1)) ;
strcpy(image->Nom, nom) ;
return 1 ;
}
else
{
image->Nom = NULL ;
image->Ext[0] = '\0' ;
image->Format[0] = '\0' ;
image->valide = 0 ;
return 0 ;
}
}

int LireFormat(FILE *pfi, img *image)
{
char F[4] ;
fread(F,sizeof(char),4,pfi) ;

if((F[2] == '\n') || ((F[2] == '\r') && (F[3] == '\n')))
{
F[2] = '\0' ;
if(strcmp(F,image->Format) != 0)
{
image->valide = 0 ;
return 0 ;
}
if(F[3] != '\n')
fseek(pfi, -1,SEEK_CUR) ;
return 1 ;
}
else
{
image->valide = 0 ;
return 0 ;
}
}

int GetComment(FILE *pfi)
{
// a adapter pour \n et \r
long pos ;
int c;

while((c = fgetc(pfi)) && (c == '#'))
{

while( ( (c = fgetc(pfi) ) != '\n' ) && (c != '\r') && (c != EOF) ) ;
if( c == '\r')
{
c = fgetc(pfi) ;
}
if(c == EOF)
{
return 0;
}
}
pos = ftell(pfi) ;
fseek(pfi,pos-1,SEEK_SET) ;
return 1 ;
}

int LireEntier(FILE *pfi, int car)
{
int c, val = 0 ;

while((c = fgetc(pfi)) && (c != EOF) && (c != ' ') && (c != '\n') && (c != '\r'))
{
if((c >= '0') && (c <= '9'))
val = val*10 + (c - '0') ;
else
return 0 ;
}
if(car != c)
return -1 ;
return val ;
}

int SetDim(FILE *pfi, img *image)
{

int w, h ;

w = LireEntier(pfi, ' ') ;
if(w <= 0)
{
image->valide = 0 ;
return -1 ;
}
h = LireEntier(pfi, '\n') ;
if(h <= 0)
{
image->valide = 0 ;
return -1 ;
}
image->w = w ;
image->h = h ;

return 1 ;
}

int SetNiveau(FILE* pfi , img *image ){

int niveau ;

niveau = LireEntier(pfi , '\n') ;
if(niveau <= 0)
{
image->valide = 0 ;
return -1 ;
}

image->nbcol = niveau ;
return 1 ;
}

int SetColor(FILE* pfi , img *image)
{
int c, pos = 0 ;

long pos2, pos1 = ftell(pfi) ;

fseek(pfi,0, SEEK_END) ;
pos2 = ftell(pfi) ;
fseek(pfi, pos1, SEEK_SET) ;

if(strcmpi(image->Format,"P5") == 0)
{
if(pos2 - pos1 != image->w*image->h)
{
image->valide = 0 ;
return - 1 ;
}
image->G = (int*)malloc(image->w*image->h*sizeof(int)) ;
while((c = fgetc(pfi)) != EOF)
{
image->G[pos++] = c ;
}
return 1 ;
}
else if(strcmpi(image->Format,"P6") == 0)
{
if(pos2 - pos1 != image->w*image->h*3)
{
image->valide = 0 ;
return - 1 ;
}
image->R = (int*)malloc(image->w*image->h*sizeof(int)) ;
image->V = (int*)malloc(image->w*image->h*sizeof(int)) ;
image->B = (int*)malloc(image->w*image->h*sizeof(int)) ;
while((c = fgetc(pfi)) != EOF)
{
image->R[pos] = c ;
image->V[pos] = fgetc(pfi) ;
image->B[pos] = fgetc(pfi) ;
pos++ ;
}
return 1 ;
}
image->valide = 0 ;
return 0 ;
}


int SaveImage(char * nom, img *image)
{
FILE *pfd ;
int pos ;
int taille = image->w*image->h ;

if(image->valide != 1)
{
image->valide = 0 ;
return - 1 ;
}

pfd = fopen(strcat(nom,image->Ext), "w") ;
if(pfd == NULL)
{
image->valide = 0 ;
return 0 ;
}
fprintf(pfd,"%s\n",image->Format) ;
fprintf(pfd,"%d %d\n",image->w,image->h) ;
fprintf(pfd,"%d\n",image->nbcol) ;
if(strcmpi(image->Format,"P5") == 0)
{
for(pos = 0 ; pos < taille ; pos++)
{
fprintf(pfd,"%c",image->G[pos]) ;
}
fclose(pfd) ;
return 1 ;
}
else if(strcmpi(image->Format,"P6") == 0)
{
for(pos = 0 ; pos < taille ; pos++)
{
fprintf(pfd,"%c%c%c",image->R[pos],image->V[pos],image->B[pos]) ;
}
fclose(pfd) ;
return 1 ;
}
fclose(pfd) ;
image->valide = 0 ;
return 0 ;
}


int ChargementImage(char *NomImage)
{
FILE * pfi = ImageOpen(NomImage) ;
if(pfi == NULL)
{
return - 1 ;
}

TabImg =(img **) realloc(TabImg, (NbrImg + 1)*sizeof(img*)) ;
TabImg[NbrImg] = (img*)malloc(sizeof(img)) ;
TabImg[NbrImg]->valide = 1 ;
//printf("\n\tA") ;
ExtensionSet(NomImage, TabImg[NbrImg]) ;
//printf("\n\tB") ;
if(TabImg[NbrImg]->valide == 0)
{
free(TabImg[NbrImg]) ;
TabImg =(img **) realloc(TabImg, NbrImg*sizeof(img*)) ;
if(NbrImg == 0)
TabImg = NULL ;
ImageClose(pfi) ;
return - 2 ;
}
//printf("\n\tC") ;
LireFormat(pfi, TabImg[NbrImg]) ;
//printf("\n\tD") ;
if(TabImg[NbrImg]->valide == 0)
{
free(TabImg[NbrImg]) ;
TabImg =(img **) realloc(TabImg, NbrImg*sizeof(img*)) ;
if(NbrImg == 0)
TabImg = NULL ;
ImageClose(pfi) ;
return - 3 ;
}
//printf("\n\tE") ;
if(GetComment(pfi) == 0)
{
free(TabImg[NbrImg]) ;
TabImg =(img **) realloc(TabImg, NbrImg*sizeof(img*)) ;
if(NbrImg == 0)
TabImg = NULL ;
ImageClose(pfi) ;
return - 4 ;
}
//printf("\n\tF") ;
SetDim(pfi, TabImg[NbrImg]) ;
if(TabImg[NbrImg]->valide == 0)
{
free(TabImg[NbrImg]) ;
TabImg =(img **) realloc(TabImg, NbrImg*sizeof(img*)) ;
if(NbrImg == 0)
TabImg = NULL ;
ImageClose(pfi) ;
return - 5 ;
}
//printf("\n\tG") ;
SetNiveau(pfi,TabImg[NbrImg]) ;
//printf("\n\tH") ;
if(TabImg[NbrImg]->valide == 0)
{
free(TabImg[NbrImg]) ;
TabImg =(img **) realloc(TabImg, NbrImg*sizeof(img*)) ;
if(NbrImg == 0)
TabImg = NULL ;
ImageClose(pfi) ;
return - 6 ;
}
//printf("\n\tI") ;
SetColor(pfi, TabImg[NbrImg]) ;
//printf("\n\tJ") ;
if(TabImg[NbrImg]->valide == 0)
{
free(TabImg[NbrImg]) ;
TabImg =(img **) realloc(TabImg, NbrImg*sizeof(img*)) ;
if(NbrImg == 0)
TabImg = NULL ;
ImageClose(pfi) ;
return - 7 ;
}
//printf("\n\tK") ;
ImageClose(pfi) ;
//printf("\n\tL") ;
NbrImg++;
return 1 ;
}

void main(int argc , char * argv[])
{
int err ;
char Fichier[50] ;
strcpy(Fichier, "img2") ;
err = ChargementImage("img1.ppm") ;
if( err > 0)
{
SaveImage(Fichier, TabImg[NbrImg-1]) ;
printf("\n\t Image sauvegarde avec succes") ;
}
else
printf("\n\t Err : %d\n", err) ;

}
A voir également:

6 réponses

Emeric84 Messages postés 30 Date d'inscription vendredi 28 décembre 2007 Statut Membre Dernière intervention 24 avril 2008 8
12 janv. 2008 à 23:10
En gros tu ne sais pas ce que fais ton programme et tu voudrais bien le savoir ?

Le nom des fonctions est suffisamment éloquent pour se rendre compte que c'est une "bibliothèque" de manipulation des images, tu peux grâce à elle effectuer toutes les opérations nécessaires au traitement d'une image : ouvrir, sauver, lire, déchiffrer...

Je sais, c'est une réponse sommaire, mais je ne vois pas trop quoi ajouter !
0
Merci pour cette breve reponse mais c'est suffisante pour moi
0
pour les fonction setcolor, setNiveau et setDim quel est leur role?
0
damlegone32 Messages postés 74 Date d'inscription lundi 11 septembre 2006 Statut Membre Dernière intervention 31 mai 2011 29
13 janv. 2008 à 00:25
Bonsoir nihad27,

Setcolor recupere dans le fichier .ppm les composantes Rouge, vert et bleue de l'image et les place dans champs R V et B de la structure image.

setNiveau recupere dans le fichier .ppm le nombre de niveau de couleur (par exemple 256 couleurs) et le place dans le champs nbcol de la structure image

setDim recupere dans le fichier .ppm la dimension de l'image (largeur,hauteur) est la stocke dans le champs w et h de la structure image

++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Merci bcp pour ces explication
0
mariostar27 Messages postés 391 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 21 août 2015 26
5 nov. 2009 à 16:31
euh...
setColor et autres servent à envoyer quelque chose pas à récupérer.
0