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"); }
//------------------------------------------------------------------------------ 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); }*/ } }