2009-07-15 8 views
0

J'ai travaillé sur tester quelques éléments en utilisant SFML 1.4 (bibliothèque multimédia simple et rapide) avec C++ et Visual C++ 2008 Express Edition. Pour éviter d'avoir des images externes avec mes programmes graphiques, je testais la fonction sf::Image::LoadFromMemory(const char * Data, std::size_t SizeInBytes) avec des ressources bitmap chargé à l'aide d'un simple script de ressources:Existe-t-il un moyen de préserver le BITMAPFILEHEADER lors du chargement d'un bitmap en tant que ressource Windows?

IDB_SPRITE BITMAP "sprite1.bmp" 

Dans mon code pour charger l'image pour créer une en utilisant cette ressource bitmap, J'utilise la procédure suivante, composée de fonctions API Win32 (je l'ai exclu le code qui vérifie que les fonctions Win32 ne reviennent pas NULL pour raccourcir ce un peu):

HRSRC hResInfo = FindResource(NULL, MAKEINTRESOURCE(IDB_SPRITE), RT_BITMAP); 
HGLOBAL hResData = LoadResource(NULL, hResInfo); 
char * resourceData = reinterpret_cast<char *>(LockResource(hResData)); 

Après cela, j'utilise la fonction sf :: Image :: LoadFromMemory:

Toutefois, cela ne fonctionne pas (j'obtiens une erreur de type de fichier inconnue).
MyImage.LoadFromMemory(resourceData, SizeofResource(NULL, hResInfo)); 

Après quelques tests, j'ai découvert que les données bitmap que je transmets à la fonction LoadFromMemory n'incluent pas BITMAPFILEHEADER (les 14 premiers octets), et je crois que c'est la cause de l'erreur de type de fichier inconnue.

Je peux restaurer BITMAPFILEHEADER manuellement et faire fonctionner la fonction LoadFromMemory correctement. Cependant, je me demande s'il y a un moyen de préserver le BITMAPFILEHEADER dans les données de ressources pour éviter cela?

Répondre

1

Modifier le script de ressources pour utiliser le type de RCDATA par opposition au type BITMAP:

IDB_SPRITE RCDATA "sprite1.bmp" 

Dans l'appel de la fonction FindResource, utilisez RT_RCDATA au lieu de RT_BITMAP:

HRSRC hResInfo = FindResource(NULL, MAKEINTRESOURCE(IDB_SPRITE), RT_RCDATA); 

Pour plus d'informations:

RCDATA Resource

Resource Types

0

Vous pouvez ajouter un fichier aux ressources en tant que ressource personnalisée au lieu de RT_BITMAP - cela ajoutera le fichier exactement tel qu'il est. Sauf si vous avez aussi besoin de: LoadImage(). L'utilisation d'un type de ressource personnalisé préserve le fichier entier.

+0

Utilisez plutôt le type de ressource standard RT_RCDATA. Stocker des données brutes est ce pour quoi il est destiné. –

Questions connexes