Как загрузить BMP в массив GLUbyte?
Вопрос
Все,
Я пытаюсь загрузить файл BMP в массив GLUbyte (без использования aux).
Невероятно, как то, что, как мне казалось, было тривиальной задачей, отнимает часы моего времени.
Кажется, в Google ничего не нашел!
Это то, что я взломал, но это не совсем работает:
// load texture
GLubyte *customTexture;
string fileName("C:\\Development\\Visual Studio 2008\\Projects\\OpenGL_Test\\Crate.bmp");
// Use LoadImage() to get the image loaded into a DIBSection
HBITMAP hBitmap = (HBITMAP)LoadImage( NULL, (LPCTSTR)const_cast<char*>(fileName.c_str()), IMAGE_BITMAP, 0, 0,
LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE );
customTexture = new GLubyte[3*256*256]; // size should be the size of the .bmp file
GetBitmapBits(hBitmap, 3*256*256, (LPVOID) customTexture);
GetBitmapDimensionEx(hBitmap,&szBitmap);
Что происходит, если вызов LoadImage возвращает неопределенное значение (NULL?Я не могу понять, загружается ли он в bmp или нет - немного запутался).
На данный момент конвертирую bmps в raw, тогда все легко.
У кого-нибудь есть фрагмент получше и почище?
Решение
LoadImage()
может загружать только растровые изображения, встроенные в ваш исполняемый файл, с помощью компилятора ресурсов — он не может загружать внешние растровые изображения из файловой системы.К счастью, растровые файлы действительно легко прочитать самостоятельно.Видеть Википедия для описания формата файла.
Просто откройте файл, как и любой другой файл (важный:откройте его в бинарном режиме, т.е.с "rb"
вариант с использованием fopen
или ios::binary
флаг с использованием C++ ifstream
), прочитать размеры растрового изображения и прочитать необработанные данные пикселей.
Другие советы
Это является обычная задача, поэтому glaux, среди прочего, предоставляет вам функции для нее.
Чтение растрового изображения — тривиальная задача, особенно если нужно учитывать только одну глубину/бит/пиксель.
Также см этот вопрос.