2009-07-15 1 views
0

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

IDB_SPRITE BITMAP "sprite1.bmp" 

В моем коде, чтобы загрузить изображение, чтобы создать с помощью этого растрового ресурса, Я использую следующую процедуру, состоящую из функций API Win32 (я исключал код, который проверяет, чтобы убедиться, что функции 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 в данных ресурсов, чтобы избежать этого?

ответ

1

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

IDB_SPRITE RCDATA "sprite1.bmp" 

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

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

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

RCDATA Resource

Resource Types

0

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

+0

Вместо этого используйте стандартный тип ресурса RT_RCDATA. Хранение необработанных данных - это то, для чего предназначено. –

 Смежные вопросы

  • Нет связанных вопросов^_^