| PMG http://forum.pmg.org.ru/ |
|
| Работа с BMP файлами http://forum.pmg.org.ru/viewtopic.php?f=1&t=16 |
Страница 1 из 1 |
| Автор: | eNrix [ 10 май 2005 22:55 ] |
| Заголовок сообщения: | Работа с BMP файлами |
Как мне считать BMP и записать его в привычный для OpenGL формат не используя функций библиотеки GLAUX. |
|
| Автор: | MagicWolf [ 12 май 2005 09:48 ] |
| Заголовок сообщения: | |
Устроит тебя IPicture Basecode: http://nehe.gamedev.net/counter.asp?fil ... icture.zip |
|
| Автор: | MagicWolf [ 15 июл 2005 14:53 ] |
| Заголовок сообщения: | |
Средствами glut и glaux это лучше не делать. Вот либы подходящие: http://www.xdp.it/cximage.htm - CxImage for Win http://openil.sourceforge.net/ - DevIL http://www.imagemagick.org/ http://freeimage.sourceforge.net/ http://www.paintlib.de/ http://www.graphicsmagick.org/ По-моему лучше всего DevIL, так как там есть сразу загрузка в текстуру. |
|
| Автор: | DDMZ [ 20 сен 2005 09:36 ] |
| Заголовок сообщения: | |
Я вообще придумал свой формат очень похожий на BMP только BGR перевернут как положено в RGB.
Сначала конвертирую BMP в свой GDIB, и загружаю его в два плевка в память, а потом в видеокарту и удаляю из памяти. Функция загрузки очень похожа на AUXDIBIMAGELOAD только библиотеку подключать ненадо
GDIB формат: 3 байта | DIB Может отсутствовать 1 байт | Резерв 2 байта | X 2 байта | Y 76543210 | Биты рассматриваются отдельно (Я это игнорирую, может пригодится для анимации) ||||||||-------- R состовляющая GL_RED |||||||--------- G Состовляющая GL_GREEN ||||||---------- B Сосотовляющая GL_BLUE |||||----------- Альфа состовляющая GL_ALPHA ||||------------ L Светлота GL_LUMINANCE |||------------- 1 единственный цветовой индекс GL_COLOR_INDEX ||-------------- D Глубина GL_DEPTH_COMPONENT |--------------- если =1 то данный параметр неучитывется а учитывается следующий 2 байта | InternalFormat (components) 1 байт | значение из /* PixelFormat */ например GL_LUMINANCE_ALPHA | Добавляется к 1900h 1 байт | значение из /* DataType */ например GL_BYTE | Добавляется к 1400h 4 байта | Длинна картинки *Данные* Если файл незаканчивается значит это анимация и грузит следующие кадры. |
|
| Автор: | MagicWolf [ 20 сен 2005 14:34 ] |
| Заголовок сообщения: | |
Лихо. Просто и понятно. |
|
| Автор: | Виталий Лещенко [ 17 апр 2006 00:40 ] |
| Заголовок сообщения: | Re: Работа с BMP файлами |
eNrix писал(а): Как мне считать BMP и записать его в привычный для OpenGL формат не
используя функций библиотеки GLAUX. Прочитать описание формата bmp и написать собственную процедуру загрузки. PS: imho это очевидно... не так ли? |
|
| Автор: | WandereR [ 17 апр 2006 01:04 ] |
| Заголовок сообщения: | |
можно например так: Код: struct BMPFileHeader { unsigned short usType; unsigned int uiSize; unsigned short usReserved1; unsigned short usReserved2; unsigned int uiOffBits; }; struct BMPInfoHeader { unsigned int uiSize; long lWidth; long lHeight; unsigned short usPlanes; unsigned short usBitCount; unsigned int uiCompression; unsigned int uiSizeImage; long lXPelsPerMeter; long lYPelsPerMeter; unsigned int uiClrUsed; unsigned int uiClrImportant; }; BOOL CImage::LoadData(char *path) { FILE *pFile; int iEnd,iStart; pFile = fopen(path,"rb"); fseek( pFile, 0, SEEK_END ); iEnd = ftell( pFile ); fseek( pFile, 0, SEEK_SET ); iStart = ftell( pFile ); iSize = iEnd - iStart; pData = new unsigned char[iSize]; if(fread(pData,sizeof(unsigned char),iSize,pFile)!=unsigned(iSize)) return FALSE; fclose(pFile); LoadBMP(); return TRUE; } BOOL CImage::LoadBMP( void ) { BMPFileHeader* fileHeader; BMPInfoHeader* infoHeader; unsigned int iImageSize; unsigned char uiTempRGB; unsigned int i; unsigned char* ucpFile= pData; fileHeader= ( BMPFileHeader* )ucpFile; ucpFile += sizeof( BMPFileHeader ); infoHeader= ( BMPInfoHeader* )ucpFile; ucpFile += sizeof( BMPInfoHeader ); ucpFile += fileHeader->uiOffBits; iImageSize= fileHeader->uiSize - fileHeader->uiOffBits; Create( infoHeader->lWidth, infoHeader->lWidth, infoHeader->usBitCount ); memcpy( pData, ucpFile, iImageSize ); for( i=0; i<infoHeader->uiSizeImage; i+=3 ) { uiTempRGB = pData[i]; pData[i] = pData[i+2]; pData[i+2]= uiTempRGB; } return true; } А вот описание класса чтоб не было вопросов по переменным Код: class CImage
{ private: int iSize; unsigned char *pData; int iWidth; int iHeight; unsigned short chBPP; BOOL LoadBMP(GLvoid); public: BOOL LoadData(char *path); BOOL Create( unsigned int uiWidth, unsigned int uiHeight, unsigned short chBPP ); BOOL Destroy( GLvoid ); сначала лоад дата, потом лоад БМП. А функция креате просто выделяет массив памяти uiWidth*uiHeight*chBBB (chBPP кол во бит на пиксель) Если я правильно понял "приемлимо для OpenGL"
|
|
| Автор: | MagicWolf [ 17 апр 2006 10:00 ] |
| Заголовок сообщения: | |
Ты здесь просто читаешь файл, а где вывод? |
|
| Автор: | WandereR [ 17 апр 2006 10:17 ] |
| Заголовок сообщения: | |
Не совсем понял что значит вывод... Можно же просто в текстуру преобразовать после LoadBMP у нас остались чистая картинка (без заголовков) и еще осталась ширина, высота... Вроде все что надо для текстуры Код: glTexImage2D( GL_TEXTURE_2D, 0, iType, m_uiWidth, m_uiHeight,
0, iType, GL_UNSIGNED_BYTE, m_ucpData ); Ну до этого всякие GenTextures и прочее но это уже понятно. |
|
| Автор: | MagicWolf [ 17 апр 2006 16:38 ] |
| Заголовок сообщения: | |
Хм, а ты выводил? |
|
| Автор: | WandereR [ 17 апр 2006 16:43 ] |
| Заголовок сообщения: | |
Угу - выводил. А что тебя смущает? есть область в памяти где 3 байта на пиксель и мы знаем сколько пикселей в ширину и высоту... все параметры для генерации текстуры
|
|
| Автор: | MagicWolf [ 18 апр 2006 08:52 ] |
| Заголовок сообщения: | |
А ну да заметил смену байт ты сделал! |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|