---------

Source C du programme principal

---------




/* 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...