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 :
Nous pouvons terminer la fonction :
1
2
3
4
|
progress.finish();
std::cerr << "Done" << std::endl;
return true;
}
|