Code de traitement d'image en C
nihad27
-
mariostar27 Messages postés 391 Date d'inscription Statut Membre Dernière intervention -
mariostar27 Messages postés 391 Date d'inscription Statut Membre Dernière intervention -
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) ;
}
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:
- Code de traitement d'image en C
- Code ascii - Guide
- Reconsidérer le traitement de vos informations à des fins publicitaires - Accueil - Réseaux sociaux
- Code de déverrouillage oublié - Guide
- Code puk bloqué - Guide
- Code activation windows 10 - Guide
6 réponses
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 !
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 !
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
++
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
++
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question