How to update a user created Bitmap in the Windows API

Posted by gamernb on Stack Overflow See other posts from Stack Overflow or by gamernb
Published on 2011-01-01T00:36:53Z Indexed on 2011/01/01 1:53 UTC
Read the original article Hit count: 611

Filed under:
|
|

In my code I quickly generate images on the fly, and I want to display them as quickly as possible. So the first time I create my image, I create a new BITMAP, but instead of deleting the old one and creating a new one for every subsequent image, I just want to copy my data back into the existing one. Here is my code to do both the initial creation and the updating. The creation works just fine, but the updating one doesn't work.

BITMAPINFO bi;
HBITMAP Frame::CreateBitmap(HWND hwnd, int tol1, int tol2, bool useWhite, bool useBackground)
{
  ZeroMemory(&bi.bmiHeader, sizeof(BITMAPINFOHEADER));
  bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  bi.bmiHeader.biWidth = width;
  bi.bmiHeader.biHeight = height;
  bi.bmiHeader.biPlanes = 1;
  bi.bmiHeader.biBitCount = 24;
  bi.bmiHeader.biCompression = BI_RGB;
  ZeroMemory(bi.bmiColors, sizeof(RGBQUAD));

  // Allocate memory for bitmap bits
  int size = height * width;
  Pixel* newPixels = new Pixel[size];

  // Recompute the output
  //memcpy(newPixels, pixels, size*3);
  ComputeOutput(newPixels, tol1, tol2, useWhite, useBackground);

  HBITMAP bitmap = CreateDIBitmap(GetDC(hwnd), &bi.bmiHeader, CBM_INIT, newPixels, &bi, DIB_RGB_COLORS);
  delete newPixels;

  return bitmap;
}

and

void Frame::UpdateBitmap(HWND hwnd, HBITMAP bitmap, int tol1, int tol2, bool useWhite, bool useBackground)
{
  ZeroMemory(&bi.bmiHeader, sizeof(BITMAPINFOHEADER));
  bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

  HDC hdc = GetDC(hwnd);
  if(!GetDIBits(hdc, bitmap, 0, bi.bmiHeader.biHeight, NULL, &bi, DIB_RGB_COLORS))
    MessageBox(NULL, "Can't get base image info!", "Error!", MB_ICONEXCLAMATION | MB_OK);

  // Allocate memory for bitmap bits
  int size = height * width;
  Pixel* newPixels = new Pixel[size];

  // Recompute the output
  //memcpy(newPixels, pixels, size*3);
  ComputeOutput(newPixels, tol1, tol2, useWhite, useBackground);

  // Push back to windows
  if(!SetDIBits(hdc, bitmap, 0, bi.bmiHeader.biHeight, newPixels, &bi, DIB_RGB_COLORS))
      MessageBox(NULL, "Can't set pixel data!", "Error!", MB_ICONEXCLAMATION | MB_OK);

  delete newPixels;
}

where the Pixel struct is just this:

struct Pixel { unsigned char b, g, r; };

Why does my update function not work. I always get the MessageBox for "Can't set pixel data!" I used code similar to this when I was loading in the original bitmap from file, then editing the data, but now when I manually create it, it doesn't work.

© Stack Overflow or respective owner

Related posts about c++

Related posts about winapi