Search code examples
c++cwinapibitmapbmp

Drawing bitmap from memory


I need to create the HBITMAP.

Here lies the problem. I have the bmp file's content in memory.

I know how to create a HBITMAP if the bitmap was as a resource. But since it is in memory, I don't know how to do it.

I do it like this (if in resource) : Link

    hDC = BeginPaint(hWnd, &Ps);

    // Load the bitmap from the resource
    bmpExercising = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_EXERCISING));
    // Create a memory device compatible with the above DC variable
    MemDCExercising = CreateCompatibleDC(hDC);
         // Select the new bitmap
         SelectObject(MemDCExercising, bmpExercising);

    // Copy the bits from the memory DC into the current dc
    BitBlt(hDC, 10, 10, 450, 400, MemDCExercising, 0, 0, SRCCOPY);

    // Restore the old bitmap
    DeleteDC(MemDCExercising);
    DeleteObject(bmpExercising);
    EndPaint(hWnd, &Ps);

Please guide me on how to do it if it were a memory resource. Somehow change char img[10000] into a resource ? Here, img is the memory contraining the contents of the bitmap.


Solution

  • First, let's remove a little innocent gotcha:

    hDC = BeginPaint(hWnd, &Ps);
    
    // Load the bitmap from the resource
    bmpExercising = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_EXERCISING));
    // Create a memory device compatible with the above DC variable
    MemDCExercising = CreateCompatibleDC(hDC);
         // Select the new bitmap
    HOBJECT oldbmp = SelectObject(MemDCExercising, bmpExercising); //<<<<save it for later ...
    
    // Copy the bits from the memory DC into the current dc
    BitBlt(hDC, 10, 10, 450, 400, MemDCExercising, 0, 0, SRCCOPY);
    
    // Restore the old bitmap
    SelectObject(MemDCExercising, oldbmp); //<<<... DeleteDC will leak memory if it holds a resource
    DeleteDC(MemDCExercising);
    DeleteObject(bmpExercising);
    EndPaint(hWnd, &Ps);
    

    Now, an HBITMAP is (conceptually speaking) a pointer to an internal structure that holds a "pointer" (in fact is much more a stream) towards the GDI memory space you cannot access.

    A "memory bitmap" is not represented into your program as a memory buffer that belogs to your program, but as ... an HBITMAP obtained with CreateCompatibleBitmap, where the HDC parameter id the DC the bitmap has to be compatible with. (usially a screen, window or painting DC).

    You can cerate an initialized bitmap passing a buffer containing initial data, or get the data a bitmap holds with CreateBitmap or GetBitmapBits.

    In any case, these are your local copy of the bitmap data, not the "live bitmap" GDI draws in.

    Note also that the internal structure of those data depends on the format (how many bits per pixel on how many planes and with or without a palette) the bitmap needs to have, and that, to avoid performance penalty in the Blit process, it must coincide with the format used by your screen setup.

    This does not necessarily have to be the same as the one the bitmap has when saved into a "bmp" file.