

/* Echantillonnage aleatoire ou pas*/
#include "ioimage.h"
#include "imdisplay.h"
int scale=1;
int aleatoire=0;
int directory=0;
int format=0;
char* nom_fichier_in;
char* nom_fichier_out="out";
char* cmdargs= "adfhi:o:s:";
char* usage=
"usage: %s %s\n"
"Liste des arguments:\n"
" -i name nom du fichier de l'image a traiter\n"
" -a choix de l'echantillonage ALEATOIRE\n"
" -s scale echelle caracteristique du sous-echantillonnage\n"
" -o name nom du fichier de sortie\n"
" -d fichier_in pas dans le repertoire courant\n"
" -f selection du format pgm pour les fichiers in /out\n"
" -h affiche ce message d'aide\n"
;
/*
* Prototypage des Fonctions
*/
void getcmdargs(int argc,char** argv);
char* add_suffix2(char* debut,char* fin);
void Echant(char* source,char* res,int sx,int sy, int scale);
void Echant_alea(char* source,char* res,int sx,int sy, int scale);
/*
* Corps des Fonctions
*/
char* add_suffix2(char* debut,char* fin)
{
static char result[255];
int i0,i;
for (i0=0;debut[i0];i0++)
result[i0]=debut[i0];
for (i=0;(result[i0+i]=fin[i])!='\0';i++);
return result;
}
void Echant(char* source,char* res,int sx,int sy, int scale)
{
int x,y;
int rx,ry;
rx=sx/scale; ry=sy/scale;
for (x=0;x<rx;x++)
for (y=0;y<ry;y++)
res[x+rx*y]=source[scale*(x+sx*y)];
}
void Echant_alea(char* source,char* res,int sx,int sy, int scale)
{
#define N(x,y) ((x)+(y)*sx)
int x,y;
int rx,ry;
int rdm_x,rdm_y;
rx=sx/scale; ry=sy/scale;
for (x=0;x<rx;x++)
for (y=0;y<ry;y++)
{
rdm_x=rand()%scale;
rdm_y=rand()%scale;
res[x+rx*y]=source[N(scale*x+rdm_x,scale*y+rdm_y)];
}
}
void getcmdargs(int argc, char** argv)
{
int c;
while((c=getopt(argc,argv,cmdargs))!=EOF)
{
switch(c)
{
case 'h':
fprintf(stderr,usage,cmdargs);
exit(0);
break;
case 'a':
aleatoire=1;
break;
case 's':
scale=atoi(optarg);
break;
case 'i':
nom_fichier_in=optarg;
break;
case 'o':
nom_fichier_out=optarg;
break;
case 'f':
format=1;
break;
case 'd':
directory=1;
break;
default:
printf("attente de 3 arguments au moins (-iNnom de fichier,-aAleatoire,-sScale)\n");
fprintf(stderr,usage,cmdargs);
exit(0);
break;
}
}
}
void main(int argc,char** argv)
{
short err;
int sx,sy;
Image source,sous_ech;
getcmdargs(argc,argv);
if(directory)
{
source=loadima_alloc(add_suffix2("/ima/images/general/",nom_fichier_in)
,&err,&sx,&sy);
printf("%s lu avec echelle %d\n",nom_fichier_in,scale);
}
else
{
if(format)
{
source=loadpgm_alloc(nom_fichier_in,&err,&sx,&sy);
printf("%s lu avec echelle %d\n",nom_fichier_in,scale);
}
else
{
source=loadima_alloc(nom_fichier_in,&err,&sx,&sy);
printf("%s lu avec echelle %d\n",nom_fichier_in,scale);
}
}
sous_ech=(Image)malloc(sx/scale*sy/scale*sizeof(char));
if(aleatoire)
Echant_alea(source,sous_ech,sx,sy,scale);
else
Echant(source,sous_ech,sx,sy,scale);
if(format)
savepgm(sous_ech,nom_fichier_out,&err,sx/scale,sy/scale);
else
saveima(sous_ech,nom_fichier_out,&err,sx/scale,sy/scale);
if(!format)
display(nom_fichier_out);
}
Problèmes, commentaires...