Bonjour à tous !
J'ai créer une classe Camera, qui commence à devenir complexe.
Pour des besoins de physique pure, j'ai dû la recoder en template afin de prendre en compte différent type de pixel possible : float, double, unsigned char, etc...
Dans la fonction genererFilm(), je génère un fichier binaire (car plus rapide) comprenant toutes les images de mon film mis bout à bout, ainsi qu'un petit fichier à côté comprenant les données du film : nombre d'images, hauteur et largeur du film...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 template <typename T> class Camera { public: typedef typename T value_type; typedef typename vigra::BasicImage<T> image_type; Camera(Choc &c, std::string nom_camera); virtual ~Camera(void); image_type getImage(const float & temps_image); // Fonction principale : appel standard image_type getImage(const int & numero_image); void genererFilm(int image_debut, int image_fin, std::string nom_fichier, boost::function<void (image_type & )> fonct); void genererFilm(float temps_debut, float temps_fin, std::string nom_fichier, boost::function<void (image_type & )> fonct); private: // du code.... };
Le problème est le suivant : Maintenant que je suis en template, comment écrire dans ce petit fichier la donnée T modèle, afin de pouvoir relire ensuite la fichier en mode binaire correctement...
Comment distinguer float et double?
Comment distinguer double et long int ?
J'avais pensé à écrire en chaine de caractère le nom, mais c'est pas très portable...
Pour info, mon ancienne fonction de lecture (unsigned short) est la suivante :
qui marche très bien tant qu'on connait le format...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void Camera_Virtuelle::importImage(int numero_image) { std::ifstream fichier(m_nom_film.c_str(), std::ios_base::in | std::ios_base::binary); std::vector<unsigned short> vect(m_taille_image); fichier.seekg(numero_image * m_taille_image * sizeof(unsigned short), std::ios_base::beg); fichier.read(reinterpret_cast<char*>(&vect[0]), m_taille_image * sizeof(unsigned short)); m_image = vigra::UInt16Image(m_image_width, m_image_height ,&vect[0]); }
Si vous pensez à une astuce propre, je vous en serais très reconnaissant !
Partager