我对一幅bmp文件进行了处理(如滤波),现在想把他保存下来.
显示的图像我是通过自己建立的类CDib实现的,处理好的图像实例为dib,在下面的函数中实现保存:
void CCDYnSplitView::OnSave() 
{
   static OPENFILENAME m_ofn;
   char a[10];
   static TCHAR szFilter[]=TEXT("Bitmap Files(*.BMP)\0*.bmp\0")\
        TEXT("All Files (*.*)\0*.*\0\0");    
    m_ofn.lStructSize=sizeof(OPENFILENAME);
    m_ofn.hwndOwner=m_hWnd;
    m_ofn.hInstance=NULL;
    m_ofn.lpstrFilter=szFilter;
    m_ofn.lpstrCustomFilter=NULL;
    m_ofn.nMaxCustFilter=0;
    m_ofn.nFilterIndex=0;
    m_ofn.lpstrFile=a;          // Set in Open and Close functions
    m_ofn.nMaxFile=MAX_PATH;
    m_ofn.lpstrFileTitle=NULL;          // Set in Open and Close functions
    m_ofn.nMaxFileTitle=MAX_PATH;
    m_ofn.lpstrInitialDir=NULL;
    m_ofn.lpstrTitle=NULL;
    m_ofn.Flags=OFN_OVERWRITEPROMPT;             // Set in Open and Close functions
    m_ofn.nFileOffset=0;
    m_ofn.nFileExtension=0;
    m_ofn.lpstrDefExt=TEXT("bmp");
    m_ofn.lCustData=0;
    m_ofn.lpfnHook=NULL;
    m_ofn.lpTemplateName=NULL;    GetSaveFileName(&m_ofn);
}
到这里,程序运行后如果点“保存”菜单,可以调出保存窗口,但是没有保存,因为没有写文件。现在的问题是:
下面的写文件怎么写?能给出适应这种情况的代码吗?不胜感激!!!

解决方案 »

  1.   

    如楼上,注意bmp是反着存放的。
      

  2.   

    void CXXXView::OnFileSave()  

    // TODO: Add your command handler code here 
    BITMAPFILEHEADER bmpFileHeader; 
    LPBITMAPINFOHEADER lpBmpInfoHeader; 
    CFileDialog dlg(FALSE,_T("BMP"),_T("*.BMP"),OFN_HIDEREADONLY ¦OFN_OVERWRITEPROMPT,_T("位图文件(*.BMP) ¦*.BMP ¦")); CString fileName; 
    if(IDOK==dlg.DoModal()) 
    fileName.Format("%s",dlg.GetPathName()); 
    else 
    return ; 
    CFile dibFile(fileName, CFile::modeCreate ¦CFile::modeWrite); 
    dibFile.Write(m_pBmpFileHeader,sizeof(BITMAPFILEHEADER)); 
    if(nPaletteSize) 
    dibFile.Write(m_pBmpInfo,sizeof(BITMAPINFO)+nPaletteSize*sizeof(RGBQUAD));//灰度图 
    else 
    dibFile.Write(m_pBmpInfoHeader,sizeof(BITMAPINFOHEADER));//RGB图 dibFile.Write(pDib,size); 
    dibFile.Close(); 
    }
      

  3.   

    判断BMP格式类型(如颜色数,大小、有无颜色表),构造好文件头,然后象素数据直接写文件保存。
      

  4.   

    GetSaveFileName只是显示保存文件对话框让用户选择保存在哪里,并不会替你保存文件,你要自己写保存文件的代码。
      

  5.   

    cnzdgs :楼主就是不会写了!LZ看看下面的是你要的不:BOOL CDib::SaveImage(LPCTSTR lpPathName)
    {
    if(m_hDib==NULL)
    return FALSE;
    CFile file;
    DWORD dwDIBSize;
    BITMAPFILEHEADER bmfHdr;
    LPBITMAPINFOHEADER lpBI;
    CFileException e;
    if(m_hDib==NULL)
    return FALSE;
    if(file.Open(lpPathName,CFile::modeCreate|CFile::modeWrite|CFile::shareDenyWrite)==NULL)
    {
    AfxMessageBox("Save error!");
    return FALSE;
    }
    lpBI=(LPBITMAPINFOHEADER)::GlobalLock((HGLOBAL)m_hDib);
    if(lpBI==NULL)
    return FALSE;
    DWORD dwsize;
    dwsize=WIDTHBYTES((lpBI->biWidth)*(lpBI->biBitCount))*lpBI->biHeight;
    dwDIBSize=*(LPDWORD)lpBI+PalSize((LPSTR)lpBI);
    dwDIBSize+=dwsize;
    bmfHdr.bfType=0x4d42;
    bmfHdr.bfSize=dwDIBSize+sizeof(BITMAPFILEHEADER);
    bmfHdr.bfReserved1=0;
    bmfHdr.bfReserved2=0;
    bmfHdr.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+lpBI->biSize+PalSize((LPSTR)lpBI);
    file.Write((LPSTR)&bmfHdr,sizeof(BITMAPFILEHEADER));
    file.WriteHuge(lpBI,dwDIBSize);
    file.Close();
    ::GlobalUnlock((HGLOBAL)m_hDib);
    return TRUE;
    }先声明,我这个绝对能保存,但是不排除有BUG