bmp文件保存为新文件后,不能显示和原文件一样的色彩,该如何解决

bmp文件保存为新文件后,不能显示和原文件一样的色彩
应该如何解决,这个问题?

保存bmp文件函数

bool   PicsMain::SaveBitmapFile(CString   strFileName,CBitmap&   bmp)
{
BITMAP   bm;
bmp.GetBitmap   (&bm);

int   nWidth   =   bm.bmWidth;
int   nHeight   =   bm.bmHeight;

int   nLineBits   =   bm.bmWidthBytes;
if   ((nLineBits   %   8)   !=   0)
nLineBits   +=   8   -   nLineBits%8;

int   nBitCounts   =   nLineBits   *   bm.bmHeight   ;

int   nBits   =   bm.bmBitsPixel;
int   nBitmapInfoSize   =   0;

if   (nBits   <=   8)
{
int   nColors   =   1   < <   nBits;
int   nPalUnitSize   =   sizeof(RGBQUAD);
nBitmapInfoSize   =   sizeof(BITMAPINFOHEADER)   +   nPalUnitSize   *   nColors;
}
else
nBitmapInfoSize   =   sizeof(BITMAPINFOHEADER);

BITMAPINFO* pbmpinfo   =   NULL;

pbmpinfo   =(BITMAPINFO   *)(new   BYTE[nBitmapInfoSize]);
ZeroMemory((void   *)pbmpinfo,nBitmapInfoSize);

BITMAPINFOHEADER*   pInfoHead   =   (BITMAPINFOHEADER   *)pbmpinfo;
ZeroMemory((void   *)pInfoHead,sizeof(BITMAPINFOHEADER));

pInfoHead-> biSize   =   sizeof(BITMAPINFOHEADER);
pInfoHead-> biBitCount   =   nBits;
pInfoHead-> biPlanes   =   1;
pInfoHead-> biSizeImage   =   nBitCounts;
pInfoHead-> biCompression   =   BI_RGB;
pInfoHead-> biWidth   =   nWidth;
pInfoHead-> biHeight   =   nHeight;
//pInfoHead-> biXPelsPerMeter   =   1024;

CDC   dc;
dc.CreateDC( "DISPLAY ",NULL,NULL,NULL);

int   nLx   =   dc.GetDeviceCaps   (LOGPIXELSX);
int   nLy   =   dc.GetDeviceCaps   (LOGPIXELSY);

double   dbInchPerMeter   =   39.375;

int   nPMx   =   (int)((double)nLx   *   dbInchPerMeter);
int   nPMy   =   (int)((double)nLy   *   dbInchPerMeter);

pInfoHead-> biXPelsPerMeter   =   nPMx;//3780;
pInfoHead-> biYPelsPerMeter   =   nPMy;//3780;

if   (nBits   <=   8)
{
int   nColors   =   1   < <   nBits;
GetDIBColorTable(dc.m_hDC,0,nColors,pbmpinfo-> bmiColors);
}

BYTE*   pBits   =   NULL;

HGLOBAL   hGlobal   =   ::GlobalAlloc(GMEM_FIXED,   nBitCounts);
pBits   =   (BYTE   *)::GlobalLock(hGlobal);
ZeroMemory((void   *)pBits,nBitCounts);

GetDIBits(dc.m_hDC,(HBITMAP)bmp,0,nHeight,pBits,pbmpinfo,DIB_RGB_COLORS);

BITMAPFILEHEADER bmfHeader;
int   nFileHeadSize   =   sizeof(BITMAPFILEHEADER);

ZeroMemory((void   *)&bmfHeader,sizeof(BITMAPFILEHEADER));
bmfHeader.bfType   =   19778;// 'BM '         ((WORD)   ( 'M '   < <   8)   |   'B ');  
bmfHeader.bfSize   =   nFileHeadSize   +   nBitmapInfoSize   +   nBitCounts;
bmfHeader.bfOffBits   =   sizeof(BITMAPFILEHEADER)   +   nBitmapInfoSize;

CFile   file;
if(!file.Open   (strFileName,CFile::modeCreate   |   CFile::modeWrite))
{
AfxMessageBox( "Write   File   Error! ");