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



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 toto(){
char *entree="gris2.ppm";



//////////////////////////////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(entree,Taille0(entree),Taille1(entree)),sortie2,Taille0(entree),Taille1(entree), 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(entree,Taille0(entree),Taille1(entree)),sortie3,Taille0(entree),Taille1(entree));
	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(entree,Taille0(entree),Taille1(entree)),sortie5,Taille0(entree),Taille1(entree));
	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(entree,Taille0(entree),Taille1(entree)),sortie6,Taille0(entree),Taille1(entree));
	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(entree,Taille0(entree),Taille1(entree)),sortie7,Taille0(entree),Taille1(entree),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(entree,Taille0(entree),Taille1(entree)),sortie8,Taille0(entree),Taille1(entree),2);
	free(sortie8);
/////////////////////////////////////////////////////////////


	return 0;
}
	 
	 
	 
	 
