Есть ли способ сохранить BITMAPFILEHEADER при загрузке растрового изображения в качестве ресурса Windows? - PullRequest
0 голосов
/ 16 июля 2009

Я несколько раз тестировал с использованием SFML 1.4 (Простая и быстрая мультимедийная библиотека) с C ++ и Visual C ++ 2008 Express Edition. Чтобы избежать внешних изображений с моими графическими программами, я тестировал функцию sf :: Image :: LoadFromMemory (const char * Data, std :: size_t SizeInBytes) с ресурсами битовой карты, загруженными с использованием простого скрипта ресурса :

IDB_SPRITE BITMAP "sprite1.bmp"

В моем коде для загрузки изображения для создания sf :: Image с использованием этого растрового ресурса я использую следующую процедуру, состоящую из функций Win32 API (я исключил код, проверяющий, чтобы сделать уверен, что функции Win32 не возвращают NULL, чтобы немного сократить это):

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

После этого я использую функцию sf :: Image :: LoadFromMemory:

MyImage.LoadFromMemory(resourceData, SizeofResource(NULL, hResInfo));

Однако это не работает (я получаю неизвестную ошибку типа файла). После некоторого тестирования я обнаружил, что данные растрового изображения, которые я передаю в функцию LoadFromMemory, не включают BITMAPFILEHEADER (первые 14 байтов), и я считаю, что это является причиной неизвестной ошибки типа файла.

Я могу восстановить BITMAPFILEHEADER вручную и заставить функцию LoadFromMemory работать нормально. Однако мне интересно, есть ли какой-нибудь способ сохранить BITMAPFILEHEADER в данных ресурса, чтобы избежать этого?

Ответы [ 2 ]

1 голос
/ 26 сентября 2009

Использование пользовательского типа ресурса сохранит весь файл. Измените сценарий ресурса, чтобы использовать тип RCDATA, а не тип BITMAP:

IDB_SPRITE RCDATA "sprite1.bmp"

В вызове функции FindResource используйте RT_RCDATA вместо RT_BITMAP:

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

Для получения дополнительной информации:

Ресурс RCDATA

Типы ресурсов

0 голосов
/ 16 июля 2009

Вы можете добавить файл к ресурсам как пользовательский ресурс вместо RT_BITMAP - это добавит файл в точности так, как он есть. Если вам также не нужно :: LoadImage () это.

...