我对一幅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);
}
到这里,程序运行后如果点“保存”菜单,可以调出保存窗口,但是没有保存,因为没有写文件。现在的问题是:
下面的写文件怎么写?能给出适应这种情况的代码吗?不胜感激!!!
显示的图像我是通过自己建立的类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);
}
到这里,程序运行后如果点“保存”菜单,可以调出保存窗口,但是没有保存,因为没有写文件。现在的问题是:
下面的写文件怎么写?能给出适应这种情况的代码吗?不胜感激!!!
{
// 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();
}
{
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