Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

array[byte] to HBITMAP or CBitmap

Tags:

c++

mfc

I have an array of bytes (which I read through a stream directly from a .bmp and then store as a BLOB in a database) which I want to display as icons in a CImageList. Therefore I want to somehow load my data into an HBITMAP or CBitmap. I have done it like this up to now, reading from a file:

hPic = (HBITMAP)LoadImage(NULL, strPath, IMAGE_BITMAP, dwWidth, dwHeight, LR_LOADFROMFILE | LR_VGACOLOR);
...
CBitmap bitmap;
bitmap.Attach(hPicRet);

But obviously, that only works for files, but not for byte-arrays. How can I get the same result, but reading from an array of byte?

Edit: Note that my array does not contain just the colour information, but rather the complete file as it is written on disk, including all headers and meta-data. It seems to me that discarding all that information is a bad idea.

like image 461
Kajetan Abt Avatar asked Feb 14 '11 14:02

Kajetan Abt


1 Answers

Assuming you have the information loaded into a BYTE array named bytes....

BITMAPFILEHEADER* bmfh;
bmfh = (BITMAPFILEHEADER*)bytes;

BITMAPINFOHEADER* bmih;
bmih = (BITMAPINFOHEADER*)(bytes + sizeof(BITMAPFILEHEADER));
BITMAPINFO* bmi;
bmi = (BITMAPINFO*)bmih;

void* bits;
bits = (void*)(bytes + bmfh->bfOffBits);

HDC hdc = ::GetDC(NULL);

HBITMAP hbmp = CreateDIBitmap(hdc, bmih, CBM_INIT, bits, bmi, DIB_RGB_COLORS) ;

::ReleaseDC(NULL, hdc);

It's a little messy and could use a hefty dose of error checking, but the basic idea is sound.

like image 65
Jon Avatar answered Nov 20 '22 03:11

Jon