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; } |