Create HBITMAP from 16-bit grayscale array
I am attempting to create a 24-bit bmp image from a 16-bit pixel
array. The 16-bit pixel array is acquired from a camera. In order to
display the bitmap as the background of my ProEssentials graph, I need
to pass the graph object a bitmap handle (HBITMAP).
The following code produces a black image. I wrote the bitmap to file
and had the same results when I opened the file with paint (I get a
black image that is 1340 x 1300 pixels). I checked the file in a hex
editor and found that the data bytes were not all zero as I would
expect with a black image.
I have been using the following code:
/*
//The data is passed into this function as "unsigned short *
frame"
//These variables are declared in the class (they are member data)
#define BITS_PER_PIXEL 24
HBITMAP hBmp;
W = 1340; //image width is 1340 pixels
H = 1300; //image height is 1300 pixels
char * bitmapMemoryBits;
//This malloc is called in the constructor and freed in the
destructor
bitmapMemoryBits = (BYTE *)malloc((W + numPadBytes)* H *
(BITS_PER_PIXEL / bitsPerByte));
*/
int numPadBytes = W % 4; //image lines must be a multiple of four.
If they are not, the line must be zero padded.
BITMAP bm;
bm.bmType = 0; //this member must be zero
bm.bmWidth = W;
bm.bmHeight = H;
bm.bmBitsPixel = BITS_PER_PIXEL;
bm.bmWidthBytes = (bm.bmWidth * (bm.bmBitsPixel/8)) + numPadBytes;
bm.bmPlanes = 1;
bm.bmBits = this->bitmapMemoryBits;
int bmbi(0); //Iterator for the Bit Map Memory bits
for(int i(0);i<H;++i)
{
for(int j(0);j<W;++j,bmbi+=3+numPadBytes) //make the red, green and
blue byte the same value (makes a gray pixel)
bitmapMemoryBits[bmbi] = bitmapMemoryBits[bmbi+1] =
bitmapMemoryBits[bmbi+2] = ((float)frame[(i*W)+j])/257.0; //divide by
257 to scale from 16 to 8 bits
for(int k(0);k<numPadBytes;++k) //pad row with zero bytes so that
the total number of bytes in the row are a multiple of 4
bitmapMemoryBits[bmbi+3+k] = 0;
}
this->hBmp = CreateBitmapIndirect(&bm);
What am I doing wrong? It may help to know that this is my first
attempt to use bitmaps.
Thanks for your time! Let me know if I left out any vital information.