#include "Memoire1.h"
#include "Gris.c"
#include "Bin.c"
#include "Niveaugris.c"
#include "Convo.c"
#include "Ero.c"
#include "Dil.c"
#include "FermOuv.c"
#include "ConvoBis.c"

Piquesel **bina(char* entree,int taille0,int taille1){
	FILE* fichier = NULL;
	char chaine[20] = "";
	int taille[2] = {0};
	taille[0]=taille0;
	taille[1]=taille1;
	int i,j,l;
	Piquesel Pix1;
	fichier = fopen(entree, "r+");
	
	fgets(chaine, 20, fichier);
	fgets(chaine, 20, fichier);
	fgets(chaine, 20, fichier);

//On créé un tableau de la taille de l'image	
	Piquesel **tableau = malloc(sizeof(Piquesel) * taille[1]); //[taille[0]][taille[1]];

	
	for (i=0 ; i<taille[1] ; i++){
		tableau[i] = malloc(sizeof(Piquesel) * taille[0]);
		for (j=0; j<taille[0]*3; j++){
			fgets(chaine, 20, fichier);
			l= atoi(chaine);
			switch(j%3){
				case 0 :
					Pix1.Red=l;//On enregistre le rouge d'un pixel dans une variable
				break;
				case 1 :
					Pix1.Green=l;//On enregistre le vert d'un pixel dans une variable
				break;
				case 2 :
					Pix1.Blue=l;//On enregistre le bleu d'un pixel dans une variable
					tableau[i][j/3]=Pix1;//on réécrit les 3 couleurs dans la case du tableau
				break;
			}
		}	
	}
	fclose(fichier);
	return tableau;
}



void TablToppm(Piquesel** tableau,char* sortie,int taille0,int taille1){
	FILE* image = NULL;
	int i,j;
	image = fopen(sortie,"w+");
	int taille[2] = {0};
	taille[0]=taille0;
	taille[1]=taille1;
//On écrit dans un nouveau fichier les données de base d'une image PPM
	fprintf(image, "P3\n");
	fprintf(image, "%d %d\n", taille[0],taille[1]);
	fprintf(image, "255\n");

//On réécrit chaque couleur dans le nouveau fichier
		for (i=0 ; i<taille[1] ; i++){
			for (j=0; j<taille[0]; j++){
					fprintf(image, "%d\n", (tableau[i][j]).Red);
					fprintf(image, "%d\n", (tableau[i][j]).Green);
					fprintf(image, "%d\n", (tableau[i][j]).Blue);	
			}
		}
    fclose(image);
}

int Taille0(char* entree){
	FILE* fichier = NULL;
	int taille[2] = {0};
	char chaine[20] = "";
	
	fichier = fopen(entree, "r+");
	fgets(chaine, 20, fichier);
	
	//On récupère la taille de l'image
	fscanf(fichier, "%d %d", &taille[0], &taille[1]);
	return taille[0];
}

int Taille1(char* entree){
	FILE* fichier = NULL;
	int taille[2] = {0};
	char chaine[20] = "";
	
	fichier = fopen(entree, "r+");
	fgets(chaine, 20, fichier);
	
	//On récupère la taille de l'image
	fscanf(fichier, "%d %d", &taille[0], &taille[1]);
	return taille[1];
}


int main(int argc, char *argv[]){
	
char *entree = (char*) malloc( 100 );
printf("Entrez le nom d'une image en COULEUR(avec extension),\nelle sera utilisée pour la mise en mémoire, la transformation \nde l'image en niveau de gris et la convolution\n\n");
scanf("%s", entree);


char *entree1 = (char*) malloc( 100 );
printf("Entrez le nom d'une image en NIVEAU DE GRIS (avec extension),\nelle sera utilisée pour la binarisation, la dilatation, \nl'érosion, l'ouverture et la fermeture\n\n");
scanf("%s", entree1);

/*////////////////////////////Mise en Mémoire///////////////////////////////	
	char *sortie = (char*) malloc( 100 );
	printf("Entrez le nom de l'image en sortie (avec extension) \n");
	scanf("%s", sortie);
	TablToppm(bina(entree,Taille0(entree),Taille1(entree)),sortie,Taille0(entree),Taille1(entree));
	free(sortie);
/////////////////////////////////////////////////////////////	


//////////////////////////////GrayScaling///////////////////////////////	
	char *sortie1 = (char*) malloc( 100 );
	printf("Entrez le nom de l'image en gris (avec extension) \n");
	scanf("%s", sortie1);
	TablToGris(bina(entree,Taille0(entree),Taille1(entree)),sortie1,Taille0(entree),Taille1(entree));
	free(sortie1);
/////////////////////////////////////////////////////////////


//////////////////////////////Binarisation///////////////////////////////	
	char *sortie2 = (char*) malloc( 100 );
	char *seuil = (char*) malloc( 100 );
	printf("Entrez le nom de l'image binarisée (avec extension) \n");
	scanf("%s", sortie2);
	printf("Entrez un seuil de binarisation \n");
	scanf("%s", seuil);
	TablToBina(bina(entree1,Taille0(entree1),Taille1(entree1)),sortie2,Taille0(entree1),Taille1(entree1), atoi(seuil));
	free(sortie2);
	free(seuil);
/////////////////////////////////////////////////////////////


//////////////////////////////Niveau de gris///////////////////////////////	
	char *sortie3 = (char*) malloc( 100 );
	printf("Entrez le nom d'un fichier recevant les données des niveaux de gris \n");
	scanf("%s", sortie3);
	Histo(bina(entree1,Taille0(entree1),Taille1(entree1)),sortie3,Taille0(entree1),Taille1(entree1));
	free(sortie3);
/////////////////////////////////////////////////////////////


//////////////////////////////Convolution///////////////////////////////	
	char *sortie4 = (char*) malloc( 100 );
	printf("Entrez le nom de la nouvelle image après convolution \n");
	scanf("%s", sortie4);
	Convo(bina(entree,Taille0(entree),Taille1(entree)),sortie4,Taille0(entree),Taille1(entree));
	free(sortie4);
/////////////////////////////////////////////////////////////


//////////////////////////////Erosion///////////////////////////////	
	char *sortie5 = (char*) malloc( 100 );
	printf("Entrez le nom de la nouvelle image après érosion \n");
	scanf("%s", sortie5);
	EroToPPM(bina(entree1,Taille0(entree1),Taille1(entree1)),sortie5,Taille0(entree1),Taille1(entree1));
	free(sortie5);
/////////////////////////////////////////////////////////////


//////////////////////////////Dilatation///////////////////////////////	
	char *sortie6 = (char*) malloc( 100 );
	printf("Entrez le nom de la nouvelle image après dilatation \n");
	scanf("%s", sortie6);
	DilToPPM(bina(entree1,Taille0(entree1),Taille1(entree1)),sortie6,Taille0(entree1),Taille1(entree1));
	free(sortie6);
/////////////////////////////////////////////////////////////


//////////////////////////////Fermeture (Dilatation puis Erosion)///////////////////////////////	
	char *sortie7 = (char*) malloc( 100 );
	printf("Entrez le nom de la nouvelle image après fermeture (Dilatation puis Erosion) \n");
	scanf("%s", sortie7);
	FermOuv(bina(entree1,Taille0(entree1),Taille1(entree1)),sortie7,Taille0(entree1),Taille1(entree1),1);
	free(sortie7);
/////////////////////////////////////////////////////////////


//////////////////////////////Ouverture (Erosion puis Dilatation)///////////////////////////////	
	char *sortie8 = (char*) malloc( 100 );
	printf("Entrez le nom de la nouvelle image après ouverture (Erosion puis Dilatation) \n");
	scanf("%s", sortie8);
	FermOuv(bina(entree1,Taille0(entree1),Taille1(entree1)),sortie8,Taille0(entree1),Taille1(entree1),2);
	free(sortie8);
*/////////////////////////////////////////////////////////////


//////////////////////////////ConvolutionBis///////////////////////////////

int i;
float **masque = malloc(sizeof(float*)*3);
for (i=0 ; i<3 ; i++){
	masque[i] = malloc(sizeof(float*)*3);
}
masque[0][0]=0.;
masque[0][1]=1.;
masque[0][2]=0.;
masque[1][0]=1.;
masque[1][1]=-4.;
masque[1][2]=1.;
masque[2][0]=0.;
masque[2][1]=1.;
masque[2][2]=0.;


int taille1=Taille1(entree);
int taille0=Taille0(entree);


	Piquesel **image = malloc(sizeof(Piquesel) * taille1);
	for (i=0 ; i<taille1 ; i++){
		image[i] = malloc(sizeof(Piquesel) * taille0);
	}
	image=ConvoBis(bina(entree,Taille0(entree),Taille1(entree)),masque,Taille0(entree),Taille1(entree));


	char *sortie = (char*) malloc( 100 );
	printf("Entrez le nom de l'image en sortie (avec extension) \n");
	scanf("%s", sortie);
	TablToppm(image,sortie,Taille0(entree),Taille1(entree));
	free(sortie);



/////////////////////////////////////////////////////////////



free(entree);
//free(entree1);
return 0;
}
