Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Assembler

Страница: 1 |

 

  Вопрос: BMP??? Добавлено: 27.02.06 06:51  

Автор вопроса:  vito | Web-сайт: softvito.narod2.ru
Я загружаю в буфер проекцию витмара (.BMP), то есть это даже не упакованый DIB(файл вместе с заголовком - BITMAPFILEHEADER).
Как прще всего получить битмам ?
Или более точно, как его правильно загрузить, и получить указатель на саму картинку?

На вопрос, нафига такая хрень.
Я читаю файл(не .BMP), который содержит в себе этот массив. Конечно можно скинуть в темп и загрузить. Но желательно сразу считать в буфер создать битмап и освободить память(думается мне так быстрее будет, файлов много).
Посдн чего создаю в памяти текстуру - для open GL.( нужен указатель на данные)


Как я это пытаюсь сделать.

/*для проверки скидываем файл на диск - все ОК*/
FILE *writePtr;
writePtr=fopen("St.bmp","wb");
fwrite(Sm_pMaterials[i].byf,sizeof(byte),Sm_pMaterials[i].imageSize ,writePtr);
fclose (writePtr);

/*_____________________________________________________*/

// пытаемся добраться до массива цветов
BITMAPFILEHEADER *pHean; // объявили структуры
BITMAPINFOHEADER * hean;
RGBQUAD *rg;

pHean= (BITMAPFILEHEADER*)Sm_pMaterials[i].byf;// приводим наш буфер к указателю
Sm_pMaterials[i].byf+= sizeof (BITMAPFILEHEADER);// смещаемся ОК


hean=(BITMAPINFOHEADER*)Sm_pMaterials[i].byf;
Sm_pMaterials[i].byf+= sizeof (BITMAPINFOHEADER);// смещаемся ОК

rg=(RGBQUAD*)Sm_pMaterials[i].byf;
Sm_pMaterials[i].byf+= sizeof (RGBQUAD)*hean->biClrUsed  ; //смещаемся не ОК!!!
/* Тыкаем в никуда*/
//Причем не на всех картинках????? Иногда попадаю:)))

Структура BMP.

BITMAPFILEHEADER - заголовок файла
BITMAPINFOHEADER - данные о файле (высота, ширина, размер и т.д.)
RGBQUAD - цветовая палитра
Color-index array - оно нам и нужно.


Ничео не понимаю.

Ответить

  Ответы Всего ответов: 3  

Номер ответа: 1
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #1 Добавлено: 27.02.06 11:03

BITMAPFILEHEADER*      bitFileHdr;
BITMAPINFOHEADER*      bitInfoHdr;
RGBQUAD*               pRGB;

bitFileHdr = (BITMAPFILEHEADER*) Sm_pMaterials[i].buf;
bitInfoHdr = (BITMAPINFOHEADER*) ((char*)bitFileHdr + sizeof(BITMAPFILEHEADER));
pRGB = (RGBQUAD*) ((char*)bitInfoHdr = sizeof (BITMAPINFOHEADER));

Ответить

Номер ответа: 2
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #2
Добавлено: 27.02.06 18:23
HOOLIGAN

Огромное спасибо, но не помогло.

Нам нужен не RGBQUAD, а Color-index array.

Вот в него я и не попадаю. Немного передделал, я думаю ты просто опечатался.

BITMAPFILEHEADER*      bitFileHdr;
BITMAPINFOHEADER*      bitInfoHdr;
RGBQUAD*               pRGB;
byte *arr;

bitFileHdr = (BITMAPFILEHEADER*) Sm_pMaterials[i].byf;
bitInfoHdr = (BITMAPINFOHEADER*) ((char*)bitFileHdr + sizeof(BITMAPFILEHEADER));
pRGB = (RGBQUAD*) ((char*)bitInfoHdr + sizeof (BITMAPINFOHEADER));
arr= (byte*)((char*)pRGB + sizeof (RGBQUAD)*bitInfoHdr->biClrUsed );


bitInfoHdr->biClrUsed - эта величина содержит количество структур RGBQUAD.
Аналогично bitFileHdr->bfOffBits - показывет смещение от начала файла до Color-index array.

Опять ничего не понимаю:(

Ответить

Номер ответа: 3
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #3
Добавлено: 28.02.06 00:54
Проблему удалось решить через одно место:))

В принципе правильно, но хотелось по другому.

Интерфейс IPicture.

и

HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);

 hr = OleLoadPicture( pstm,Sm_pMaterials[t].imageSize,TRUE,IID_IPicture,(void**)&pPicture);  

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам