int biWidth;
biWidth=bm[0].bmWidth;
while (biWidth%4!=0)
{
biWidth++;
}

BITMAPFILEHEADER   bmfh;   
bmfh.bfType=0x4d42;   
bmfh.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+bm[0].bmHeight*biWidth*3;  
bmfh.bfReserved1=bmfh.bfReserved2=0;   
bmfh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);   
    
BITMAPINFOHEADER   bmih;   
bmih.biWidth=biWidth;   
bmih.biHeight=bm[0].bmHeight;   
bmih.biPlanes=1;   
bmih.biBitCount=24;   
bmih.biCompression=BI_RGB;   
bmih.biSizeImage=bm[0].bmHeight*biWidth*3;   
bmih.biXPelsPerMeter=0;   
bmih.biYPelsPerMeter=0;   
bmih.biClrUsed=0;   
bmih.biClrImportant=0;   
bmih.biSize=sizeof(BITMAPINFOHEADER);   
    
CFileDialog dlg(FALSE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"All Files(*.*)|*.*| |",AfxGetMainWnd());
CString strPath;
if(dlg.DoModal()==IDOK)
{
strPath=dlg.GetPathName();
if(strPath.Right(4)!=".bmp")
strPath+=".bmp";
}
CFile fp;

fp.Open(strPath,CFile::modeCreate | CFile::modeWrite);

fp.Write((LPSTR)&bmfh,sizeof(BITMAPFILEHEADER)); //写文件头

fp.Write((LPSTR)&bmih,sizeof(BITMAPINFOHEADER)); //写信息头

fp.Write(m_BData,bm[0].bmHeight*biWidth);//写数据

fp.Close();各位大哥我想把m_BData里面的数据保存成为图片、
为什么保存出来的图片什么都没有
大哥这是错那里呀
谢谢大家了

解决方案 »

  1.   

    这是一个位图保存的算法,你参考下,你上面计算的时候一些错误.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;       //GetDeviceCaps根据指定设备场景代表的设备的功能返回信息        //计算位图文件每个像素所占字节数        hDC = CreateDC("DISPLAY", NULL, NULL, NULL);        iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);//
    BITSPIXEL
     
    位/像素(每个调色板)
     PLANES
     
    调色板个数
             DeleteDC(hDC);        if (iBits <= 1)        wBitCount = 1;        else if (iBits <= 4) wBitCount = 4;        else if (iBits <= 8) wBitCount = 8;        else   wBitCount = 24;               GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);        bi.biSize           = sizeof(BITMAPINFOHEADER);        bi.biWidth          = Bitmap.bmWidth;        bi.biHeight         = Bitmap.bmHeight;        bi.biPlanes         = 1;        bi.biBitCount       = wBitCount;        bi.biCompression    = BI_RGB;        bi.biSizeImage         = 0;        bi.biXPelsPerMeter     = 0;        bi.biYPelsPerMeter     = 0;        bi.biClrImportant      = 0;        bi.biClrUsed           = 0;               dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;               //为位图内容分配内存        hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));        lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);        *lpbi = bi;
            // 处理调色板         hPal = GetStockObject(DEFAULT_PALETTE); //取得默认调色板        if (hPal)        {               hDC = ::GetDC(NULL);               hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);               RealizePalette(hDC);        }
            // 获取该调色板下新的像素值        GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)                       +dwPaletteSize4 圔ITMAPINFO *)lpbi, DIB_RGB_COLORS);               //恢复调色板         if (hOldPal)        {               ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);               RealizePalette(hDC);               ::ReleaseDC(NULL, hDC);        }
            //创建位图文件         fh = CreateFile(FileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,                                      FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);               if (fh == INVALID_HANDLE_VALUE) return FALSE;               // 设置位图文件头        bmfHdr.bfType = 0x4D42; // "BM"        dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;         bmfHdr.bfSize = dwDIBSize;        bmfHdr.bfReserved1 = 0;        bmfHdr.bfReserved2 = 0;        bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;        // 写入位图文件头        WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);        // 写入位图文件其余内容//      WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);        //清除         GlobalUnlock(hDib);        GlobalFree(hDib);        CloseHandle(fh);
            return TRUE;}
      

  2.   

    fp.Write(m_BData,bm[0].bmHeight*biWidth);//写数据 
    ==============
    你少了一个最关键的函数GetDIBits,用这个才能获取位图数据