Saving BMP file renders Black Image

Tech-Archive recommends: Repair Windows Errors & Optimize Windows Performance



Hi all,
I am trying to save a bmp file from a pictureholder. The code works
fine for most of the images but certain images it renders as a black
rectangle. I have found that when the color format bit is 8 bits it
renders black.
Can anyone let me know what is the problem?

if (ppbBitmap != NULL)
ppbBitmap->m_ppicholderBitmap->m_pPict->get_Handle((unsigned int *)
&hndBitmap);


memset(&bmp, 0x00, sizeof (bmp));
// Retrieve the bitmap color format, width, and height.
if (!GetObject(hndBitmap, sizeof(BITMAP), (LPSTR)&bmp))
exit(0);

// Convert the color format to a count of bits.
cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel);
if (cClrBits == 1)
cClrBits = 1;
else if (cClrBits <= 4)
cClrBits = 4;
else if (cClrBits <= 8)
cClrBits = 8;
else if (cClrBits <= 16)
cClrBits = 16;
else if (cClrBits <= 24)
cClrBits = 24;
else cClrBits = 32;

// Allocate memory for the BITMAPINFO structure. (This structure
// contains a BITMAPINFOHEADER structure and an array of RGBQUAD
// data structures.)

if (cClrBits != 24)
pbmi = (PBITMAPINFO) LocalAlloc(LPTR, sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) * (1<< cClrBits));

// There is no RGBQUAD array for the 24-bit-per-pixel format.
else
pbmi = (PBITMAPINFO) LocalAlloc(LPTR, sizeof(BITMAPINFOHEADER));

// Initialize the fields in the BITMAPINFO structure.

pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = bmp.bmWidth;
pbmi->bmiHeader.biHeight = bmp.bmHeight;
pbmi->bmiHeader.biPlanes = bmp.bmPlanes;
pbmi->bmiHeader.biBitCount = bmp.bmPlanes * bmp.bmBitsPixel;


if (cClrBits < 24)
pbmi->bmiHeader.biClrUsed = (1<<cClrBits);
// If the bitmap is not compressed, set the BI_RGB flag.
pbmi->bmiHeader.biCompression = BI_RGB;

// Compute the number of bytes in the array of color
// indices and store the result in biSizeImage.
// For Windows NT, the width must be DWORD aligned unless
// the bitmap is RLE compressed. This example shows this.
// For Windows 95/98/Me, the width must be WORD aligned unless the
// bitmap is RLE compressed.
pbmi->bmiHeader.biSizeImage = ((pbmi->bmiHeader.biWidth * cClrBits
+31) & ~31) /8 * pbmi->bmiHeader.biHeight;
// Set biClrImportant to 0, indicating that all of the
// device colors are important.
pbmi->bmiHeader.biClrImportant = 0;

pbih = (PBITMAPINFOHEADER) pbmi;
lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);

if (!lpBits)
exit(0);

// Retrieve the color table (RGBQUAD array) and the bits
// (array of palette indices) from the DIB.
if (!GetDIBits(pDC->m_hDC, hndBitmap, 0, (WORD) pbih->biHeight, lpBits,
pbmi, DIB_RGB_COLORS))
{
exit(0);
}

strFileName.Format(_T("%s\\RTF\\Pic.bmp"), m_strFilePathForTempFolder);


strRTFBmpFilePath += strFileName;
strFileName.Empty();


// Create the .BMP file.
hf = CreateFile(strRTFBmpFilePath ,
GENERIC_READ | GENERIC_WRITE,
(DWORD) 0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
(HANDLE) NULL);

if (hf == INVALID_HANDLE_VALUE)
exit(0);

hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M"

// Compute the size of the entire file.
hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) +
pbih->biSize + pbih->biClrUsed
* sizeof(RGBQUAD) + pbih->biSizeImage);
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;

// Compute the offset to the array of color indices.
hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) +
pbih->biSize + pbih->biClrUsed
* sizeof (RGBQUAD);

// Copy the BITMAPFILEHEADER into the .BMP file.
if (!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER),
(LPDWORD) &dwTmp, NULL))
{
exit(0);
}

// Copy the BITMAPINFOHEADER and RGBQUAD array into the file.
if (!WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER)
+ pbih->biClrUsed * sizeof (RGBQUAD),
(LPDWORD) &dwTmp, ( NULL)))
exit(0);

// Copy the array of color indices into the .BMP file.
dwTotal = cb = pbih->biSizeImage;
hp = lpBits;
if (!WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL))
exit(0);

// Close the .BMP file.
if (!CloseHandle(hf))
exit(0);

// Free memory.
GlobalFree((HGLOBAL)lpBits);

.



Relevant Pages

  • Re: VB3 is making my head spin!
    ... If you are running at less than full colour depth (16 bit ... machine running at full colour depth will save it as a 24 bit bmp file). ... It is this "what would the depth be of a bitmap that you saved to disk ... Perhaps you have misunderstood the 8 bit colour palette business. ...
    (comp.lang.basic.visual.misc)
  • Re: Displaying Long Binary Data in a Report
    ... in Acess you are inserting the BMP file as an OLE Object. ... Rather than saving a Bitmap file, ... StudentSign field is being populated with students' signatures (captured ...
    (microsoft.public.access.reports)
  • Re: VB3 is making my head spin!
    ... >machine running at full colour depth will save it as a 24 bit bmp file). ... >It is this "what would the depth be of a bitmap that you saved to disk ... >Accelerator code doesn't handle RLE compression (which I think your own ... define a new palette (I did not know that bitmap definer could also ...
    (comp.lang.basic.visual.misc)
  • Re: Help with SendKeys
    ... converting a 24 bit Windows bmp file to a 4 bit Windows bmp file, ... for an output that is a standard Windows 16 colour bmp file, ... understand yourself and doing it without using any Windows API ... your bitmap code. ...
    (comp.lang.basic.visual.misc)
  • Re: Encode BMP files
    ... > Is there a way to encode and then decode BMP files? ... > Maybe i can apply some kind of a mask to bmp file so it couldn't be opened ... I use a simple structure as a Header. ... then add the byte array. ...
    (microsoft.public.vb.general.discussion)