为什么在内存中获得的bmp文件保存起来后再读取会失真?解决方案

为什么在内存中获得的bmp文件保存起来后再读取会失真?
1.先用BitBlt取得原始bmp文件中的某一块。
-------------------------------
CBitmap*       bmp=new   CBitmap;      
HBITMAP       hbmp=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),path,  
IMAGE_BITMAP,0,0,LR_LOADFROMFILE);      
bmp-> Attach(hbmp);
//CDC对象生成
CDC   *p_MDC1   =   new   CDC;      
CDC   *p_MDC2   =   new   CDC;

//CBitmap指针对象生成
CBitmap   *pOldBt1,   *pOldBt2;      
CBitmap   *bmPtr   =   new   CBitmap;

CClientDC   dc(NULL);                
p_MDC2-> CreateCompatibleDC(&dc);
pOldBt2=p_MDC2-> SelectObject(/*pBitmap*/bmp);
p_MDC1-> CreateCompatibleDC(&dc);

                  //生成新位图

bmPtr-> CreateCompatibleBitmap(&dc,divWidth,divHeight);
                  //将新位图选入CDC对象中
pOldBt1=p_MDC1-> SelectObject(bmPtr);  
p_MDC1-> BitBlt(0,   0,   divWidth,   divHeight,   p_MDC2,cx,cy,SRCCOPY);  

p_MDC1-> SelectObject(pOldBt1);      
p_MDC1-> DeleteDC();      
p_MDC2-> SelectObject(pOldBt2);      
p_MDC2-> DeleteDC();
                  //返回CBitmap对象
BITMAP       bitmap;          
    bmPtr-> GetBitmap(&bitmap);
HBITMAP       hbit=(HBITMAP)(*bmPtr);
SaveBmp(hbit, "test3.bmp ");
---------------------------


2。然后调用SaveBmp将分割后的文件保存到本地。
------------------------------------
BOOL       SaveBmp(HBITMAP       hBitmap,       CString       FileName)      
    {      
    HDC       hDC;      
    //当前分辨率下每象素所占字节数      
    int       iBits;      
    //位图中每象素所占字节数      
    WORD       wBitCount;      
    //定义调色板大小,       位图中像素字节大小       ,位图文件大小       ,       写入文件字节数          
    DWORD       dwPaletteSize=0,       dwBmBitsSize=0,       dwDIBSize=0,       dwWritten=0;          
    //位图属性结构          
    BITMAP       Bitmap;              
    //位图文件头结构      
    BITMAPFILEHEADER       bmfHdr;              
    //位图信息头结构          
    BITMAPINFOHEADER       bi;              
    //指向位图信息头结构              
    LPBITMAPINFOHEADER       lpbi;              
    //定义文件,分配内存句柄,调色板句柄          
    HANDLE       fh,       hDib,       hPal,hOldPal=NULL;