本帖最后由 helloruan 于 2010-06-21 17:14:11 编辑

解决方案 »

  1.   

    你上面是用来保存DIB位图的,而你写的BITMAPINFOHEADER *infoHead=(BITMAPINFOHEADER*)m_pDib,是不对的。
    下面的可以保存DIB位图:
    BOOL ImgDib::Write(LPCTSTR lpszPathName)
    {
    //写模式打开文件
    CFile file;
    if (!file.Open(lpszPathName, CFile::modeCreate | CFile::modeReadWrite 
    | CFile::shareExclusive))
    return FALSE; //填写文件头结构
    BITMAPFILEHEADER bmfh;
    bmfh.bfType = 0x4d42;  // 'BM'
    bmfh.bfSize = 0;
    bmfh.bfReserved1 = bmfh.bfReserved2 = 0;
    bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
    sizeof(RGBQUAD) * m_nColorTableLength;
    try {
    //文件头结构写进文件
    file.Write((LPVOID) &bmfh, sizeof(BITMAPFILEHEADER));

    //文件信息头结构写进文件
    file.Write(m_lpBmpInfoHead,  sizeof(BITMAPINFOHEADER)); //如果有颜色表的话,颜色表写进文件
    if(m_nColorTableLength!=0)
         file.Write(m_lpColorTable, sizeof(RGBQUAD) * m_nColorTableLength); //位图数据写进文件
    int imgBufSize=(m_imgWidth*m_nBitCount/8+3)/4*4*m_imgHeight;
    file.Write(m_pImgData, imgBufSize);
    }
    catch(CException* pe) {
    pe->Delete();
    AfxMessageBox("write error");
    return FALSE;
    } //函数返回
    return TRUE;
    }//调用write()即可
    void CImgDibDlg::OnSaveBmp() 
    {
    CString m_szFileName;
    //pNewDib为用来保存图像的DIB指针
           if (pNewDib!=NULL) 
    {
    CFileDialog dlg(FALSE, _T("bmp"), _T("Temp.bmp"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("Bitmap Files (*.bmp)|*.bmp|All Files (*.*)|*.*||"), this);
    if(dlg.DoModal() == IDOK)
    {
    m_szFileName = dlg.GetPathName();
    pNewDib->Write(m_szFileName);
    }
    }
    else
    MessageBox("图像未进行处理!");
    }
      

  2.   

    "你上面是用来保存DIB位图的,而你写的
    BITMAPINFOHEADER *infoHead=(BITMAPINFOHEADER*)m_pDib,是不对的。"yangjie7732 可以解释一下为什么吗?我的m_pDib所指向的缓冲区是用来存储除了文件头BITMAPFILEHEADER结构以外的位图数据的,这样定义的BITMAPINFOHEADER *infoHead=(BITMAPINFOHEADER*)m_pDib没有取到需要存储的位图数据的信息头吗?