Bonsoir à toutes et à tous,
Je suis débutant (une semaine et demie intensive, en autodidacte) en programmation C++ (mon premier langage POO). Cependant, grâce au codes sources trouvés un peu partout sur la toile, en y passant des journées, et en passant au crible chaque ligne, j’ai réussi à apprendre la syntaxe, les bases de la POO et, je crois, la notion de pointeur (que je comprend comme une adresse mémoire).
Après avoir réussi à charger / sauvegarder une image BMP, je me retrouve face à un mur lorsque j’essaie de mettre en place l’histogramme d’un BMP 24 bpp non compressé chargé au préalable.
Voici le code que j’ai étudié :
A savoir que m_Data est le flux de données du BMP lu au moyen de la méthode :
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
22
23
24
25
26
27
28
29
30
31 // Constitue l'histogramme de l'image suivant le canal R=4,G=3,B=2,GRAY=1 ou RGB=0 : bool ClassBMP::Histogram(int Canal) { if((!m_Bitmap) || (m_Header.m_BitCount!=24)) return false; unsigned int Value; if(Hist) delete Hist; unsigned int * Hist = new unsigned int[255]; for(int i=0; i<256; i++) Hist[i]=0; unsigned char * BmpIndex = &m_Data[m_Header.m_OffBits]; for(int i=0; i<m_Header.m_Height; i++) { for(int j=0; j<m_Header.m_Width; j++) { switch(Canal) { case GRAY: Value = (BmpIndex[0]+BmpIndex[1]+BmpIndex[2])/3;break; case BLUE: Value = BmpIndex[0];break; case GREEN: Value = BmpIndex[1];break; case RED: Value = BmpIndex[2];break; } } Hist[Value]+=1; BmpIndex+=3; } return true; }
Je souhaiterais commencer par afficher ligne par ligne dans la console :
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
22
23
24
25
26
27
28
29 // Charge le flux de donnée m_Data à partir du fichier FileName : bool ClassBMP::LoadData(char * FileName) { unsigned long FileSize; // Taille du flux. std::ifstream IntStream; // Crée l'interface de gestion de flux Input (cf. http://www.cplusplus.com/reference/iostream/ifstream/). IntStream.open(FileName, std::ios::binary); // Ouverture du fichier. if(IntStream==NULL) return false; // Si rien n'a été ouvert, on alerte. // Obtention de la taille du fichier : IntStream.seekg(0, std::ios_base::end); // On déplace le curseur en fin de flux. FileSize = IntStream.tellg(); // Position du curseur situé en fin de flux par rapport au début (0). IntStream.seekg(0, std::ios_base::beg); // On se replace au début. if(m_Data) delete m_Data; // Supprime un eventuel précédant flux. // Changement de m_Data : m_Data = new unsigned char[FileSize]; if(m_Data==NULL) // Si on a rien chargé. { IntStream.close(); return false; } IntStream.read((char*)m_Data, FileSize); // Renseignement de m_Data. IntStream.close(); // On oublie pas rompre le pont entre l'interface de flux et le fichier. return true; }
Intensité du canal (de 0 à 255) | Nombre de pixel de cette intensité (obtenu par le script précédant).
J'écris donc ceci dans le main.cpp :
Et il me ressort 256 lignes de nombres "unsigned int" sans aucune signification apparente, indépendants de l'image choisie. J'imagine donc que c'est une erreur sur l'utilisation des pointeurs, mais cela fait trois jours que j'essaie en vain de régler le problème...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 #include "bmp.h" #include <iostream> using namespace std; int main() { ClassBMP Bmp1; Bmp1.Load("../Ressources/1pxRVB.bmp"); // Image d'un pixel de couleur composée pour tester, enregistré en 24bpp sans compression évidement. Bmp1.Histogram(RED);// RED est une constante globale (valant 4). for(int i=0; i<=255; i++) cout << "Niveau de rouge : " << i << ", " << Bmp1.Hist[i] << endl; }
Pourriez-vous m'aider?
Je vous remercie d'avance et vous souhaite une bonne journée!
Partager