Поиск:

Ответ в темуСоздание новой темы Создание опроса
> битмап из набора байтов 
:(
    Опции темы
dandy77
Дата 1.2.2009, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 18.7.2008

Репутация: нет
Всего: нет



У меня есть CByteArray- набор байтов (откуда беру не важно- но вобще с записи базы данных). Так вот как мне этот CByteArray преобразовать в битмап и вывести на диалоговую форму? То есть фактически мне нужна статья по этому делу- сам искал не нашел. Статья на тему CreateDIBitmap и вобще что бы разобраться с битмапами.
PM MAIL   Вверх
Earnest
Дата 2.2.2009, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Если у тебя полная информация о цвете (т.е. по 3 байта RGB или даже по 4), то проще всего создать bitmap с помощью функции CreateBitmap. Естественно, при этом массив байтов-цветов должен соответствовать ожидаемому формату пикселов (для 24-bit растра порядок байтов обратный, т.е. BGR; для 32-битного не помню, нужно уточнить в MSDN); при этом строки должны быть выровнены на слово (2 байта). 


--------------------
...
PM   Вверх
dandy77
Дата 2.2.2009, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 18.7.2008

Репутация: нет
Всего: нет



это слишком для меня сложно. я в выше приведенном посте ничего не понял. мне бы основы bitmap почитать. например где береться информация о цвете? что значит выше 

Цитата

т.е. по 3 байта RGB или даже по 4


Цитата

массив байтов-цветов должен соответствовать ожидаемому формату пикселов (для 24-bit растра порядок байтов обратный, т.е. BGR; для 32-битного не помню, нужно уточнить в MSDN); при этом строки должны быть выровнены на слово (2 байта).


как это массиб байт- цветов должен соответствовать ожидаемому формату (!!!) пикселей. может мне сначала начать с устройства самого битмапа? так где это почитать?
PM MAIL   Вверх
Earnest
Дата 2.2.2009, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Например MSDN -> Graphics & Multimedia -> Windows GDI -> SDK Documention -> Windows GDI -> Bitmaps


--------------------
...
PM   Вверх
dandy77
Дата 2.2.2009, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 18.7.2008

Репутация: нет
Всего: нет



Хорошо, спасибо. А можете мне объяснить следующий код по строчкам? Только там убираються заголовки, которые база данных дописывает перед файлом bmp 78, 82, 0 байт- на это не обращайте внимания. Начинайте со строки, где убираеться BITMAPFILEHEADER:

Код

int HeaderLen =   0 + sizeof(BITMAPFILEHEADER);


И если можна по русски раскажите что такое BITMAPFILEHEADER, BITMAPINFOHEADER, BITMAPINFO (msdn на англ. просто) и как вычисляеться lpDIBBits? Если можна вобщим так что бы понятно было расскажите.

Код

BOOL CBlobs2Dlg::ReadFromBLOB(CByteArray & DBArray)
{

    CByteArray Array;
    Array.Copy( DBArray); 
    // the header of BLOB is OLE stuff like "Paint Brush Application" .... ecc..
    // the len is 78 byte ( I do not know for other headers ) 
    //int HeaderLen =   78 + sizeof(BITMAPFILEHEADER); //заголовок 78 байт
    //int HeaderLen =   82 + sizeof(BITMAPFILEHEADER);    //заголовко 82 байт
    int HeaderLen =   0 + sizeof(BITMAPFILEHEADER);        //заголовок 0 байт- чистый bmp файл из поля бд
    Array.RemoveAt( 0, HeaderLen ); // I cut all Headers 
    
    // some BMP information  
    BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)Array.GetData() ;
    BITMAPINFO &bmInfo = *(LPBITMAPINFO)Array.GetData() ;
    
    
     // If bmiHeader.biClrUsed is zero we have to infer the number
     // of colors from the number of bits used to specify it.
     int nColors = bmiHeader.biClrUsed ? bmiHeader.biClrUsed : 1 << bmiHeader.biBitCount;

     LPVOID lpDIBBits;
     if( bmInfo.bmiHeader.biBitCount > 8 )
        lpDIBBits = (LPVOID)((LPDWORD)(bmInfo.bmiColors + bmInfo.bmiHeader.biClrUsed) + 
                        ((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0));
     else
        lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);


     CClientDC dc(NULL);
    
     HBITMAP hBmp = CreateDIBitmap( dc.m_hDC,   // handle to device context 
                                &bmiHeader,     // pointer to bitmap size and format data 
                                CBM_INIT,       // initialization flag 
                                lpDIBBits,      // pointer to initialization data 
                                &bmInfo,        // pointer to bitmap color-format data 
                                DIB_RGB_COLORS);                // color-data usage 
     
     
    OleBmp.Attach( hBmp );

    Array.RemoveAll(); //Relese Memory

    

    

    return TRUE;

}


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0474 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.