int nColors = bmInfo.bmiHeader.biClrUsed ? bmInfo.bmiHeader.biClrUsed :
1 << bmInfo.bmiHeader.biBitCount; // Create the palette if needed if( pDC-GetDeviceCaps(RASTERCAPS) & RC_PALETTE && nColors <= 256 ) { // The device supports a palette and bitmap has color table // Allocate memory for a palette UINT nSize="sizeof(LOGPALETTE)" + (sizeof(PALETTEENTRY) * nColors); LOGPALETTE *pLP="(LOGPALETTE" *) new BYTE[nSize]; pLP-palVersion = 0x300;
pLP->palNumEntries = nColors;
for( int i=0; i <ncolors; i++) { long lSquareSum="bmInfo.bmiColors[i].rgbRed" * bmInfo.bmiColors[i].rgbRed + bmInfo.bmiColors[i].rgbGreen * bmInfo.bmiColors[i].rgbGreen + bmInfo.bmiColors[i].rgbBlue * bmInfo.bmiColors[i].rgbBlue; int nGray="(int)sqrt(((double)lSquareSum)/3);" pLP-palPalEntry[i].peRed = nGray;
pLP->palPalEntry[i].peGreen = nGray;
pLP->palPalEntry[i].peBlue = nGray;
pLP->palPalEntry[i].peFlags = 0;
}
pal.CreatePalette( pLP );
delete[] pLP;
// Select the palette
pOldPalette = pDC->SelectPalette(&pal, FALSE);
pDC->RealizePalette();
}
else if((pDC->GetDeviceCaps(RASTERCAPS) & RC_PALETTE) == 0 && nColors <= 256 ) { // Device does not supports palettes but bitmap has a color table // Modify the bitmaps color table directly // Note : This ends up changing the DIB. If that is not acceptable then // copy the DIB and then change the copy rather than the original for( int i="0;" i < nColors; i++) { long lSquareSum="bmInfo.bmiColors[i].rgbRed" * bmInfo.bmiColors[i].rgbRed + bmInfo.bmiColors[i].rgbGreen * bmInfo.bmiColors[i].rgbGreen + bmInfo.bmiColors[i].rgbBlue * bmInfo.bmiColors[i].rgbBlue; int nGray="(int)sqrt(((double)lSquareSum)/3);" bmInfo.bmiColors[i].rgbRed="nGray;" bmInfo.bmiColors[i].rgbGreen="nGray;" bmInfo.bmiColors[i].rgbBlue="nGray;" } } int nWidth="bmInfo.bmiHeader.biWidth;" int nHeight="bmInfo.bmiHeader.biHeight;" // Draw the image LPVOID lpDIBBits="(LPVOID)(bmInfo.bmiColors" + nColors); ::SetDIBitsToDevice(pDC-m_hDC, // hDC