Search code examples
winapihbitmap

Get bytes from HBITMAP


How can I get image bytes from hbitmap if I am given an HBITMAP pointer, and my application is console application. I tryed using GetDIBits which require such parameter as HDC, which I can't get.

EDIT: I load bitmap from file:

HBITMAP bm = 0; 
BITMAP Bitmap;
bm = (HBITMAP)LoadImage (0, TEXT("C:\\img1.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

I pass the HBITMAP to the function and expect to get another HBITMAP of processed image:

HBITMAP out1 = func(bm);

Where func is:

HBITMAP func(HBITMAP im);

And the problem is how to get image bytes from HBITMAP.


Solution

  • See new answer since question was edited...

    You cannot do this without a handle to the device context (HDC). This is because GetDIBits expects an HBITMAP which is

    A handle to the bitmap. This must be a compatible bitmap (DDB).

    A DDB is a Device-Dependent Bitmap, (as opposed to a DIB, or Device-Independent Bitmap). That means:

    Note that a DDB does not contain color values; instead, the colors are in a device-dependent format.

    Which is why GetDIBits requires an HDC. Otherwise it cannot get the color information.

    Perhaps a good question is, where did you get an HBITMAP without an accompanying HDC?


    If you're trying to create this bitmap in memory, first you can call CreateCompatibleDC to create an in-memory DC compatible with some device, then CreateCompatibleBitmap with that DC. Then you have an HBITMAP and HDC to work with as you please. Otherwise, if you don't know what your HBITMAP is pointing to, you can't expect to do anything useful with it.