예제 #1
0
int main()
{
    string fichier;
    ImagePNG originale,compressee;
    QuadTree arbre;

 //   fichier = "i.png";
  //  originale.charger(fichier);

/*    cout << endl << "-------------------------------------------------" << endl;
    cout << "Original :" << endl;
    arbre.importer(originale);
    arbre.afficher();


    cout << endl << "-------------------------------------------------" << endl;
    cout << "Sans perte :" << endl;
    arbre.importer(originale);
    arbre.compressionDelta(0);
    arbre.afficher();
    compressee = arbre.exporter();
    compressee.sauver("zip-d000-"+fichier);

    cout << endl << "-------------------------------------------------" << endl;
    cout << "Delta=128 :" << endl;
    arbre.importer(originale);
    arbre.compressionDelta(128);
    arbre.afficher();
    compressee = arbre.exporter();
    compressee.sauver("zip-d128-"+fichier);

    cout << endl << "-------------------------------------------------" << endl;
    cout << "Phi=4 :" << endl;
    arbre.importer(originale);
    arbre.compressionPhi(4);
    arbre.afficher();
    compressee = arbre.exporter();
    compressee.sauver("zip-p004-"+fichier);
    
    cout << endl << "-------------------------------------------------" << endl;
    cout << "Phi=1 :" << endl;
    arbre.importer(originale);
    arbre.compressionPhi(1);
    arbre.afficher();
    compressee = arbre.exporter();
    compressee.sauver("zip-p001-"+fichier);
*/    
        cout << endl << "-------------------------------------------------" << endl;
    fichier = "pngs/16.png";
    originale.charger(fichier);
    cout << "Phi=7 :" << endl;
    arbre.importer(originale);
    arbre.compressionPhi(7);
    arbre.afficher();
    compressee = arbre.exporter();
    compressee.sauver("zip-p001-16.png");
}
예제 #2
0
//------------------------------------------------------------------------------
void QuadTree::importer(const ImagePNG & img)
{
	/*On récupère la largeur de l'image sur laquelle on travaille utile pour savoir si on peut extraire
	la couleur des pixels. Dans le cas de base length = 2 correspond a une image de 4 pixels */ 
	int length = img.hauteur();

	//On créé des QuadTree qui vont être embranchés
	QuadTree *NW = new QuadTree;
	QuadTree *NE = new QuadTree;
 	QuadTree *SE = new QuadTree;
 	QuadTree *SW = new QuadTree;

	//Cas de base on travaille sur une image de 4 pixels
	if(length == 2){

		/* On crée la liaison entre les différents noeuds, ici les fils du QuadTree créé pointent sur
		les racines des QuadTree créés */
		_racine.fils[0] = &NW->_racine;
		_racine.fils[1] = &SW->_racine;
		_racine.fils[2] = &NE->_racine;
		_racine.fils[3] = &SE->_racine;

		// On créé la liaison dans l'autre sens de la précédente, on fait pointer les QuadTree créés sur leur père 
		NW->_racine.pere = &(_racine);   
		//On remplit la couleur des Quadtree, ceux si n'ont pas de fils il s'agit de feuilles
		NW->_racine.rvb = img.lirePixel(0,0);
			
		NE->_racine.pere = &(_racine);	 
		NE->_racine.rvb = img.lirePixel(1,0);

		SE->_racine.pere = &(_racine);
		SE->_racine.rvb = img.lirePixel(1,1);

		SW->_racine.pere = &(_racine);
		SW->_racine.rvb = img.lirePixel(0,1);

		//On stocke la couleur des 4 feuilles dans une vecteur
		vector<Couleur> vecCol;
		for(int i = 0; i <= 3; ++i){ 
			vecCol.push_back(_racine.fils[i]->rvb);
		}	
		//On remplit le noeud père des feuilles avec la couleur moyenne de celles-ci
		_racine.rvb = moyenne(vecCol); 
		//Mise à jour de la taille, ici cas de base, on a 4 feuilles
		_taille = 4;
	}
	else{  
   
		//Découpage de l'image en 4 sous images de taille égale
		ImagePNG image0 = ImagePNG(length/2,length/2);
		ImagePNG image1 = ImagePNG(length/2,length/2);
		ImagePNG image2 = ImagePNG(length/2,length/2);
		ImagePNG image3 = ImagePNG(length/2,length/2);

		//Remplissage des images crées
		for(int y = 0; y <= length/2 -1; ++y){
			for(int x = 0; x <= length/2 -1; ++x){
				image0.ecrirePixel(x,y,img.lirePixel(x,y));
				image1.ecrirePixel(x,y,img.lirePixel(x,y+length/2));
				image2.ecrirePixel(x,y,img.lirePixel(x+length/2,y));
				image3.ecrirePixel(x,y,img.lirePixel(x+length/2,y+length/2));
			}
		}

		
		/* On crée la liaison entre les différents noeuds, ici les fils du QuadTree créé pointent sur
		les racines des QuadTree créés */
		_racine.fils[0] = &(NW->_racine);
		//On créé la liaison dans l'autre sens, pointant sur le père
		NW->_racine.pere = &_racine;
		//On importe la nouvelle image créé sur le nouveau quadtree (récursivité)
		NW->importer(image0);

		_racine.fils[1] = &(SW->_racine);
		SW->_racine.pere = &_racine;
		SW->importer(image1);

		_racine.fils[2] = &(NE->_racine);
		NE->_racine.pere = &_racine;
		NE->importer(image2);

		_racine.fils[3] = &(SE->_racine);
		SE->_racine.pere = &_racine;
		SE->importer(image3);

		//On stocke la couleur des 4 feuilles dans une vecteur
		vector<Couleur> vecCol;
		for(int i = 0; i <= 3; ++i){ 
			vecCol.push_back(_racine.fils[i]->rvb);
		}	
		//Mise à jour couleur moyenne du noeud
		_racine.rvb = moyenne(vecCol); 

		//Mise à jour de la taille, somme des tailles des fils du noeud
		_taille = (NW->_taille) + (NE->_taille) + (SW->_taille) + (SE->_taille);

		//Compression sans perte qu'on met en commentaire (pas ici)  
		/* for(int i = 0; i <= 2; ++i){
		if(diff_lum(_racine.fils[i]->rvb, _racine.fils[i+1]->rvb) == 0){
		flag = false;
		break;
		}
		}

		if(flag == true){
		_racine.rvb = _racine.fils[0]->rvb;
		}else{
		_racine.rvb = moyenne(vecCol);
		}*/
	}
}