Salut à tous!!
Je ne sais pas si mon post a sa place ici, mais voila mon problème :
J'ai décidé de me documenter un peu et de me faire mes propres méthodes de chargement de fichier .BMP pour le chargement de texture OpenGL, car j'utilise initialement la bibliothèque SDL pour ces routines là, et j'aimerais m'en séparer.
Jusqu'à présent, je ne cherches qu'à charger des images en 24bits (les 256 couleurs etc seront une fois que j'aurais réglé mon souci), du coup, je n'ai à priori pas à faire usage des palettes RGBQUAD.
De manière générale, le chargement fonctionne sur la quasi totalité des images que j'essaye de charger, mais pour une raison que j'ignore, il demeure certains fichiers qui une fois chargés s'affichent n'importe comment.
Voila le résultat:
Comme vous pouvez le voir, l'herbe, ainsi que les petits personnages s'affichent correctement, tandis que le carré buggé, et ce qui est censé être un logo en bas à droite ne s'affichent pas correctement, pourtant ils utilisent les mêmes méthodes pour le chargement.
Au début j'ai pensé au BitCount, mais ces fichiers fautifs sont comme ceux qui fonctionnent, ça veux dire en 24bits, de même pour la résolution, 72ppp.
Du coup, j'ai tenté de copier-coller l'intégralité, ou une toute petite portion du fichier fautif dans un fichier vierge, pensant qu'il pouvait être corrompu (et encore?), mais rien à faire le problème persiste sans que je n'en comprenne la raison.
Bref, je ne vois pas trop d'où ça pourrait venir; que ce soit une erreur dans mon code, ou un oubli d'un élément important.
Sachant que ma routine de chargement de texture fonctionne depuis le début, et vu les différents tests que j'ai fait, j'en ai conclu que ce n'était pas là le problème, mais bien au niveau du chargement du BMP, voici donc mon code (je code en C++, mais j'ai fait usage des flux C, beaucoups plus rapides pour écrire dans un bloc mémoire avec fread)
Si jamais vous avez une question ou avez besoin d'un renseignement supplémentaire, n'hésitez pas
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82 #include <stdio.h> using namespace std; #pragma pack(push, 1) ///Header de fichier du BITMAP struct BITMAPFILEHEADER { unsigned short bfType; unsigned int bfSize; unsigned short bfReserved1; unsigned short bfReserved2; unsigned int bfOffBits; }; ///Header d'information du BITMAP struct BITMAPINFOHEADER { unsigned int biSize; unsigned int biWidth; unsigned int biHeight; unsigned short biPlanes; unsigned short biBitCount; unsigned int biCompression; unsigned int biSizeImage; unsigned int biXPelsPerMeter; unsigned int biYPelsPerMeter; unsigned int biClrUsed; unsigned int biClrImportant; }; ///Couleur de palette colorimétrique struct RGBQUAD { unsigned char rgbBlue; unsigned char rgbGreen; unsigned char rgbRed; unsigned char rgbReserved; }; ///Pixel de BITMAP struct PIXEL { unsigned char b; unsigned char g; unsigned char r; }; struct BITMAP { ///Membres de structure BITMAPFILEHEADER bitmapfileheader; BITMAPINFOHEADER bitmapinfoheader; PIXEL** bitmaparray; ///Constructeur BITMAP(const char* f) { ///Ouverture du fichier et lecture des fichiers d'en tête FILE* file = NULL; file = fopen(f,"r"); fread(&bitmapfileheader,sizeof(BITMAPFILEHEADER),1,file ); fread(&bitmapinfoheader,sizeof(BITMAPINFOHEADER),1,file ); ///Plaçage du curseur au début des données pixel fseek ( file, bitmapfileheader.bfOffBits , SEEK_SET ); ///Création du tableau de donnée pixel bitmaparray = new PIXEL*[bitmapinfoheader.biWidth]; for(int i=0; i<bitmapinfoheader.biWidth ; i++) bitmaparray[i]= new PIXEL[bitmapinfoheader.biHeight]; ///Copie et remplissage du tableau de donnée pixel for(int h=0; h<bitmapinfoheader.biHeight; h++) for(int w=0; w<bitmapinfoheader.biWidth; w++) fread(&bitmaparray[w][h],sizeof(PIXEL),1,file ); ///Fermeture du fichier, et libération des ressources temporaires fclose(file); } }; #pragma pack(pop)
Sur ce, merci d'avance pour votre aide!!
Partager