Using GetBitmapBits and SetBitmapBits






3.71/5 (7 votes)
Explains how to build a bitmap from a byte array using GetBitmapBits and SetBitmapBits
Introduction
This article explains how you can build a bitmap from an array of bytes.This array of bytes is nothing but the byte information of some bitmap which may be obtained in various ways; for example from a camera board whose buffer contains the image data in the form of an array of bytes and you want to build the actual image from this data. For this article we will be obtaining the array of bytes from a known bitmap and use this array to build an initially empty bitmap resource.
Getting Started
- Use MFC AppWizard to generate an SDI application.
- Use the resource editor to build two bitmaps, both of the same dimensions,one of them will actually have some image in it while the other will be a blank image.
Adding Code
Modify yourOnDraw()
to look like this : void CBmpTryView::OnDraw(CDC* pDC) { CBmpTryDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here CDC memdcX,memdcY; memdcX.CreateCompatibleDC(pDC); //map these CDC objects to your window DC memdcY.CreateCompatibleDC(pDC); BITMAP bmpX,bmpY; CBitmap mybmp,bmpClone; bmpClone.LoadBitmap(IDB_BITMAP2); //initialize the clone bitmap object(empty image in //this case) before using DWORD dwValue,dwValue2; if(TRUE == mybmp.LoadBitmap(IDB_BITMAP1)) { mybmp.GetBitmap(&bmpX); //Get bitmap dimensions //into BITMAP structure. BYTE* bmpBuffer=(BYTE*)GlobalAlloc(GPTR, bmpX.bmWidthBytes*bmpX.bmHeight);//allocate memory for image //byte buffer dwValue=mybmp.GetBitmapBits(bmpX.bmWidthBytes*bmpX.bmHeight, bmpBuffer);//Get the bitmap bits //into a structure dwValue2 = bmpClone.SetBitmapBits(bmpX.bmWidthBytes*bmpX.bmHeight, bmpBuffer);//generate image from //above buffer bmpClone.GetBitmap(&bmpY); memdcX.SelectObject(mybmp);//select original bitmap memdcY.SelectObject(bmpClone);//select clone //Draw the original bitmap pDC->BitBlt(10,10,bmpX.bmWidthBytes,bmpX.bmHeight ,&memdcX, 0,0,SRCCOPY); //Draw the cloned bitmap image pDC->BitBlt(10,40,bmpX.bmWidthBytes,bmpX.bmHeight ,&memdcY, 0,0,SRCCOPY); GlobalFree((HGLOBAL)bmpBuffer);//Free memory } }