3.2.1.3 : La fonction de HDF5 aux images PNG



Ensuite la fonction qui convertira le fichier HDF5 en images PNG :

1
2
3
4
5
6
///Simulate the images
/**	@param inputFile : input hdf5 file name
 * 	@param outputDir : Output directory of the created images
 * 	@return true on succsess, false otherwise
*/
bool simulateImage(const std::string & inputFile, const std::string & outputDir){


Tout d'abord, nous lisons les données HDF5 (nous pourions aussi les lire par bloc, mais commençons par des choses simples) :

1
2
	MatrixHdf5 fullMat;
	fullMat.read(inputFile);


Le là, on peut extraire le nombre d'images et leur taille :

1
2
3
	size_t nbImage(fullMat.getNbEntries()), nbRow(fullMat.getNbRow()), nbCol(fullMat.getNbCol());
	
	std::cout << "simulateImage : nbImage = "<<nbImage<<", nbRow = " << nbRow << ", nbCol = " << nbCol << std::endl;


On se créer une image PNG temporaire de la bonne taille :

1
2
3
4
5
	PImagePng image;
	if(!image.createImage(nbCol, nbRow, PImagePng::RGB)){
		std::cerr << "simulateImage : cannot create image" << std::endl;
		return false;
	}


Il nous faut également un moyen de convertir des valeurs en couleurs :

1
2
3
4
5
6
	PColorMap colorMap;
	colorMap.addColor(0.0, "000000");
	colorMap.addColor(0.2, "00FF00");
	colorMap.addColor(0.21, "FFFF00");
	colorMap.addColor(0.4, "FF0000");
	colorMap.addColor(0.6, "FFFFFF");


On créé la barre de chargement et on boucle sur les images

1
2
3
	ProgressBarr progress(nbImage);
	for(size_t i(0lu); i < nbImage; ++i){
		progress.progress(i);


On récupère l'image i de notre fichier HDF5 :

1
		float * matValue = fullMat.getTabMat(i);


Puis on la convertit en image en couleur :

1
		image.setColor(matValue, nbRow, nbCol, colorMap);


On définit le nom de l'image que l'on va sauvegarder :

1
2
		std::stringstream fileName;
		fileName << outputDir << i << ".png";


On sauvegarde l'image (en gérant une éventuelle erreur) :

1
2
3
4
		if(!image.write(fileName.str())){
			std::cerr << "simulateImage : cannot save image " << i << " in file '"<<fileName.str()<<"'" << std::endl;
			return false;
		}


C'est tout pour notre boucle principale :

1
	}


Nous pouvons terminer la fonction :

1
2
3
4
	progress.finish();
	std::cerr << "Done" << std::endl;
	return true;
}