Форум » [x]Harbour » Как прочитать BITMAP из ресурса » Ответить

Как прочитать BITMAP из ресурса

Pasha: Я использую библитеку freeimage, у которой есть функции для чтения картинок: fi_load и fi_loadfrommem У меня картинка находится в самом файле exe в bitmap-ресурсе. Функцию fi_load в этом случае использовать нельзя, я хочу загрузить ресурс в символьную переменную, и затем вызвать fi_loadfrommem. Вопрос: как прочитать ресурс из exe ? LoadResource возвращает handle, а что с ним делать дальше ?

Ответов - 8

fil: А надо именно посредством freeimage, или можно ресурсником ?

Pasha: fil пишет: А надо именно посредством freeimage Да. Я храню картинки в мемо-полях и загружаю их посредством fi_loadfrommem. Но некоторые картинки надо загружать в любом случае. Загружать их из файла (bmp, jpg) неудобно, хотелось бы из ресурса.

Петр: Воспользуйтесь LoadBitmap, LoadImage или LoadImageFromRes для получения bitmap потом fi_bitmap := fi_BitmapToFi( bitmap ) DeleteObject(bitmap) и дальше.. [pre2]HB_FUNC ( LOADBITMAPFROMRES ) { HBITMAP hBitmap; hBitmap = (HBITMAP) LoadImage( GetModuleHandle( NULL ), hb_parc( 1 ), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION ); hb_retnl( (LONG) hBitmap ); //hb_retptr( (void*) hBitmap ) } [/pre2]


Петр: Pasha пишет: Загружать их из файла (bmp, jpg) неудобно, хотелось бы из ресурса Из bmp HB_FUNC ( LOADBITMAPFROMFILE ) { HBITMAP hBitmap; hBitmap = (HBITMAP) LoadImage( 0, hb_parc( 1 ), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION ); hb_retnl( (LONG) hBitmap ); //или hb_retptr( (void*) hBitmap ); }

Pasha: Как оказалось, у файла bmp есть еще заголовок, а в ресурсе он хранится без заголовка Поэтому достаточно прицепить спереди заголовок. В результате у меня получилась такая функция: [pre]#include "hbapi.h" #include "windows.h" HB_FUNC( LOADBMPRES ) { HINSTANCE hMod = GetModuleHandle( 0 ); HRSRC hRes = FindResource( hMod, ( LPSTR ) hb_parc( 1 ), ( LPSTR ) RT_BITMAP ); LONG ulLen = SizeofResource( hMod, hRes ); HGLOBAL hglb = LoadResource( hMod, hRes ); BITMAPFILEHEADER bmpFH; char *szStr; bmpFH.bfType = 0x4d42; bmpFH.bfSize = ulLen + sizeof( bmpFH ); bmpFH.bfReserved1 = bmpFH.bfReserved1 = 0; bmpFH.bfOffBits = 0x3e; if( ulLen ) { szStr = hb_xgrab( ulLen + sizeof( bmpFH ) ); memcpy( szStr, (char *) &bmpFH, sizeof( bmpFH ) ); memcpy( szStr + sizeof( bmpFH ), (char *) LockResource( hglb ), ulLen ); UnlockResource( hglb ); FreeResource( hglb ); hb_retclen( szStr, ulLen + sizeof( bmpFH ) ); hb_xfree( szStr ); } else hb_retc( "" ); }[/pre]

Pasha: Петр пишет: fi_BitmapToFi( bitmap ) А что это за функция ? Я ее не нахожу

gfilatov: Pasha пишет: что это за функция ? Это - функция из contrib библиотеки xharbour\contrib\freeimage. // -------------------------------------------------------------------------- // Convert from HBITMAP to FreeImage ---------------------------------------- // -------------------------------------------------------------------------- // implementation: FIBITMAP *dib = FI_BitmapToFi( HBITMAP bitmap ); HB_FUNC( FI_BITMAPTOFI ) ...

Pasha: нашел, спасибо



полная версия страницы