怎样在一个单文档中打开与保存一个BMP位图文件! 小弟是一个VC初学者,现在学习利用VC进行一些简单的图像处理,书上有一种方法,但是我试试了好多次都没有成功,所以现在在这里请教各位达人了,能不能给小弟一个简单实例(编译可以通过的),谢谢达人们了!小弟在此跪谢大家了! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你还需要在视中可以修改这个BMP吗? to:code8238(二进制动物)是呀,还要对这副图像进行一些处理后,保存!老大你有源代码吗??能够发给我吗??谢谢了!我的QQ:69965868谢谢了,你给我吗??期待…………中……………… LoadBitmap就可以了,你也可以在内存中创建内存图像,然后再和LoadBitmap的图片关联起来 http://www.vckbase.com/code/listcode.asp?mclsid=7&sclsid=701随便一个都可以!! /这部分是存储DIB的过程BOOL WINAPI SaveDIB(HDIB hDib,CFile& file){ BITMAPFILEHEADER bmfile; LPBITMAPINFOHEADER lpBI; DWORD dwDIBSize; if(hDib==NULL) { return FALSE; } lpBI=(LPBITMAPINFOHEADER)::GlobalLock((HGLOBAL)hDib); if(lpBI==NULL) { return FALSE; } if(!IS_WIN30_DIB(lpBI)) { //我在这里只是提供了WIN30格式的DIB保存,其他格式的就退出了 ::GlobalUnlock((HGLOBAL)hDib); return FALSE; } bmfile.bfType=DIB_HEADER_MARKER; //我前面的那个宏定义,即BM; //这里本身可以用GLOBALSIZE函数直接求出DIB大小,因为我的全局内存部分总是多 //几个字节,所以用BITMAPINFOHEADER 中BISIZE即这个结构的大小,加上我定义的API函数 //求的PALETTE大小 dwDIBSize=*(LPDWORD)lpBI+::PaletteSize((LPSTR)lpBI); //剩下加上图像的实际占用内存,分两种情况 if((lpBI->biCompression==BI_RLE8)||(lpBI->biCompression==BI_RLE4)) { dwDIBSize+=lpBI->biSizeImage; } else { dwDIBSize+=WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount))*lpBI->biHeight; //其实很多bmp文件头中的SIZEIMAGINE都是错误的,所以这里重新填写 lpBI->biSizeImage=WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount))*lpBI->biHeight; } bmfile.bfSize=sizeof(BITMAPFILEHEADER)+dwDIBSize; bmfile.bfReserved1=0; bmfile.bfReserved2=0; bmfile.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+lpBI->biSize+PaletteSize((LPSTR)lpBI); //写文件的时候我用到TRY和CATCH块 TRY { file.Write((LPSTR)&bmfile,sizeof(BITMAPFILEHEADER)); file.WriteHuge(lpBI,dwDIBSize); //这个函数用于写大于64KB字节的数据 } CATCH (CFileException,e) { ::GlobalUnlock((HGLOBAL)hDib); THROW_LAST(); } END_CATCH; ::GlobalUnlock((HGLOBAL)hDib); return TRUE;}//读取文件的操作HDIB WINAPI ReadDIBFile(CFile& file){ BITMAPFILEHEADER bmfHeader; DWORD dwBitsSize; HDIB hDIB; LPSTR pDIB; dwBitsSize=file.GetLength(); if(file.Read((LPSTR)&bmfHeader,sizeof(bmfHeader))!=sizeof(bmfHeader)) { return NULL; } if(bmfHeader.bfType!=DIB_HEADER_MARKER) { return NULL; } //为DIB分配内存 hDIB=(HDIB)::GlobalAlloc (GMEM_MOVEABLE|GMEM_ZEROINIT,dwBitsSize); if(hDIB==0) { return NULL; } //锁定句柄 pDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB); //开始读取数据 if(file.ReadHuge(pDIB,dwBitsSize-sizeof(BITMAPFILEHEADER))!=dwBitsSize-sizeof(BITMAPFILEHEADER)) { ::GlobalUnlock((HGLOBAL)hDIB); ::GlobalFree((HGLOBAL)hDIB); return NULL; } ::GlobalUnlock((HGLOBAL)hDIB); return hDIB;}BOOL CImageDoc::OnOpenDocument(LPCTSTR lpszPathName) { CFile file; CFileException fe; //打开文件错误类 //下面这个函数REPORT....是MFC特有的,我挖出来因为它省略了我自己CATCH各种错误时 //不必要的自定义报错方式.第三个参数为TRUE时,是存储用的,反之是读取用到的,最后一个 //是书上给的 //OPEN函数的第三个参数是打开错误类的地址 if(!file.Open(lpszPathName,CFile::modeRead|CFile::shareDenyWrite,&fe)) { ReportSaveLoadException (lpszPathName,&fe,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC); //RETURN FALSE return FALSE; } DeleteContents(); BeginWaitCursor(); TRY { m_hDIB=::ReadDIBFile(file); } //第二参数的帮助文档说明,是个指针名字exception_object_pointer_name CATCH(CFileException,eLoad ) { file.Abort(); EndWaitCursor(); ReportSaveLoadException(lpszPathName,eLoad,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC); m_hDIB=NULL; return FALSE; } END_CATCH; //初始化DIB InitDIBData(); //如果图像句柄为空,弹出对话框 if(m_hDIB==NULL) { AfxMessageBox("读取文件出错,该程序不支持此类型");return FALSE; } SetPathName(lpszPathName); SetModifiedFlag (FALSE); return TRUE;}void CImageDoc::OnFileOpen() { if(IsModified()) { if(MessageBox(NULL,"reopen failed","system hint",MB_ICONQUESTION|MB_YESNO)==IDNO) { return; } } CFile file; CFileException fe; CString strPathName=GetPathName (); if(!file.Open(strPathName,CFile::modeRead|CFile::shareDenyWrite,&fe)) { ReportSaveLoadException(strPathName,&fe,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC); return; } BeginWaitCursor(); TRY { m_hDIB=::ReadDIBFile(file); } CATCH(CFileException,eLoad) { file.Abort(); EndWaitCursor(); ReportSaveLoadException(strPathName,eLoad,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC); m_hDIB=NULL; return; } END_CATCH; InitDIBData(); if(m_hDIB==NULL) { CString strMsg; strMsg="读取文件出错,可能不支持该类型的图像文件"; MessageBox(NULL,strMsg,NULL,MB_ICONINFORMATION|MB_OK); EndWaitCursor(); return; } SetModifiedFlag(FALSE); UpdateAllViews(NULL); EndWaitCursor(); return;}BOOL CImageDoc::OnSaveDocument(LPCTSTR lpszPathName) { CFile file; CFileException fe; //注意这里用REPORT函数的时候把FALSE改为TRUE if(!file.Open(lpszPathName,CFile::modeCreate|CFile::modeReadWrite|CFile::shareExclusive,&fe)) { ReportSaveLoadException(lpszPathName,&fe,TRUE,AFX_IDP_INVALID_FILENAME); return FALSE; } BOOL m_bSuccess=FALSE; TRY { BeginWaitCursor(); m_bSuccess=::SaveDIB(m_hDIB,file); file.Close(); } CATCH (CException,eSave) //这里的类编程了CEXCEPTION { //这是变成写指针 file.Abort(); EndWaitCursor(); ReportSaveLoadException(lpszPathName,eSave,TRUE,AFX_IDP_FAILED_TO_SAVE_DOC); return FALSE; } END_CATCH; EndWaitCursor(); SetModifiedFlag(FALSE); if(!m_bSuccess) AfxMessageBox("无法保存BMP图像!!!!"); return m_bSuccess; } 关于RadioButton分组 ATL中的ActiveX server component问题求助 bitmapbutton问题 bitmap文件打开及显示的问题 *****用什么方法发送邮件才能躲过杀毒软件的监控?***** 请大虾推荐一本VC网络编程的最适合初学者的教程!!! 怎么会出现以下错误?? 如何判断一个文件是否打开成功? 一个小问题,急死俺了,谁看到进来一下 WIN7下调用系统打印的问题 关于ADO连接口令中的特殊字符 VC与数据库的连接问题:VC与ACCESS表连接,程序执行出现“未发现数据源名称且未指定驱动程序”是怎么回事 ?
是呀,还要对这副图像进行一些处理后,保存!老大你有源代码吗??能够发给我吗??
谢谢了!我的QQ:69965868
谢谢了,你给我吗??
期待…………中………………
随便一个都可以!!
BOOL WINAPI SaveDIB(HDIB hDib,CFile& file)
{
BITMAPFILEHEADER bmfile;
LPBITMAPINFOHEADER lpBI;
DWORD dwDIBSize;
if(hDib==NULL)
{
return FALSE;
} lpBI=(LPBITMAPINFOHEADER)::GlobalLock((HGLOBAL)hDib);
if(lpBI==NULL)
{
return FALSE;
}
if(!IS_WIN30_DIB(lpBI))
{
//我在这里只是提供了WIN30格式的DIB保存,其他格式的就退出了
::GlobalUnlock((HGLOBAL)hDib);
return FALSE;
}
bmfile.bfType=DIB_HEADER_MARKER; //我前面的那个宏定义,即BM;
//这里本身可以用GLOBALSIZE函数直接求出DIB大小,因为我的全局内存部分总是多
//几个字节,所以用BITMAPINFOHEADER 中BISIZE即这个结构的大小,加上我定义的API函数
//求的PALETTE大小
dwDIBSize=*(LPDWORD)lpBI+::PaletteSize((LPSTR)lpBI);
//剩下加上图像的实际占用内存,分两种情况
if((lpBI->biCompression==BI_RLE8)||(lpBI->biCompression==BI_RLE4))
{
dwDIBSize+=lpBI->biSizeImage;
}
else
{
dwDIBSize+=WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount))*lpBI->biHeight;
//其实很多bmp文件头中的SIZEIMAGINE都是错误的,所以这里重新填写
lpBI->biSizeImage=WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount))*lpBI->biHeight;
}
bmfile.bfSize=sizeof(BITMAPFILEHEADER)+dwDIBSize;
bmfile.bfReserved1=0;
bmfile.bfReserved2=0;
bmfile.bfOffBits=(DWORD)sizeof(BITMAPFILEHEADER)+lpBI->biSize+PaletteSize((LPSTR)lpBI); //写文件的时候我用到TRY和CATCH块
TRY
{
file.Write((LPSTR)&bmfile,sizeof(BITMAPFILEHEADER));
file.WriteHuge(lpBI,dwDIBSize); //这个函数用于写大于64KB字节的数据
}
CATCH (CFileException,e)
{
::GlobalUnlock((HGLOBAL)hDib);
THROW_LAST();
}
END_CATCH; ::GlobalUnlock((HGLOBAL)hDib);
return TRUE;
}
//读取文件的操作
HDIB WINAPI ReadDIBFile(CFile& file)
{
BITMAPFILEHEADER bmfHeader;
DWORD dwBitsSize;
HDIB hDIB;
LPSTR pDIB; dwBitsSize=file.GetLength();
if(file.Read((LPSTR)&bmfHeader,sizeof(bmfHeader))!=sizeof(bmfHeader))
{
return NULL;
} if(bmfHeader.bfType!=DIB_HEADER_MARKER)
{
return NULL;
} //为DIB分配内存
hDIB=(HDIB)::GlobalAlloc (GMEM_MOVEABLE|GMEM_ZEROINIT,dwBitsSize);
if(hDIB==0)
{
return NULL;
}
//锁定句柄
pDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);
//开始读取数据
if(file.ReadHuge(pDIB,dwBitsSize-sizeof(BITMAPFILEHEADER))!=dwBitsSize-sizeof(BITMAPFILEHEADER))
{
::GlobalUnlock((HGLOBAL)hDIB);
::GlobalFree((HGLOBAL)hDIB);
return NULL;
} ::GlobalUnlock((HGLOBAL)hDIB);
return hDIB;
}
BOOL CImageDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
CFile file;
CFileException fe; //打开文件错误类
//下面这个函数REPORT....是MFC特有的,我挖出来因为它省略了我自己CATCH各种错误时
//不必要的自定义报错方式.第三个参数为TRUE时,是存储用的,反之是读取用到的,最后一个
//是书上给的
//OPEN函数的第三个参数是打开错误类的地址
if(!file.Open(lpszPathName,CFile::modeRead|CFile::shareDenyWrite,&fe))
{
ReportSaveLoadException (lpszPathName,&fe,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC); //RETURN FALSE
return FALSE;
}
DeleteContents();
BeginWaitCursor();
TRY
{
m_hDIB=::ReadDIBFile(file);
}
//第二参数的帮助文档说明,是个指针名字exception_object_pointer_name
CATCH(CFileException,eLoad )
{
file.Abort();
EndWaitCursor();
ReportSaveLoadException(lpszPathName,eLoad,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC);
m_hDIB=NULL;
return FALSE;
}
END_CATCH; //初始化DIB
InitDIBData(); //如果图像句柄为空,弹出对话框
if(m_hDIB==NULL)
{
AfxMessageBox("读取文件出错,该程序不支持此类型");return FALSE;
} SetPathName(lpszPathName);
SetModifiedFlag (FALSE);
return TRUE;
}void CImageDoc::OnFileOpen()
{
if(IsModified())
{
if(MessageBox(NULL,"reopen failed","system hint",MB_ICONQUESTION|MB_YESNO)==IDNO)
{
return;
}
}
CFile file;
CFileException fe;
CString strPathName=GetPathName ();
if(!file.Open(strPathName,CFile::modeRead|CFile::shareDenyWrite,&fe))
{
ReportSaveLoadException(strPathName,&fe,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC);
return;
}
BeginWaitCursor();
TRY
{
m_hDIB=::ReadDIBFile(file);
}
CATCH(CFileException,eLoad)
{
file.Abort();
EndWaitCursor();
ReportSaveLoadException(strPathName,eLoad,FALSE,AFX_IDP_FAILED_TO_OPEN_DOC);
m_hDIB=NULL;
return;
}
END_CATCH;
InitDIBData();
if(m_hDIB==NULL)
{
CString strMsg;
strMsg="读取文件出错,可能不支持该类型的图像文件";
MessageBox(NULL,strMsg,NULL,MB_ICONINFORMATION|MB_OK);
EndWaitCursor();
return;
}
SetModifiedFlag(FALSE);
UpdateAllViews(NULL);
EndWaitCursor();
return;
}
BOOL CImageDoc::OnSaveDocument(LPCTSTR lpszPathName)
{
CFile file;
CFileException fe; //注意这里用REPORT函数的时候把FALSE改为TRUE
if(!file.Open(lpszPathName,CFile::modeCreate|CFile::modeReadWrite|CFile::shareExclusive,&fe))
{
ReportSaveLoadException(lpszPathName,&fe,TRUE,AFX_IDP_INVALID_FILENAME);
return FALSE;
}
BOOL m_bSuccess=FALSE;
TRY
{
BeginWaitCursor();
m_bSuccess=::SaveDIB(m_hDIB,file);
file.Close();
}
CATCH (CException,eSave) //这里的类编程了CEXCEPTION
{
//这是变成写指针
file.Abort();
EndWaitCursor();
ReportSaveLoadException(lpszPathName,eSave,TRUE,AFX_IDP_FAILED_TO_SAVE_DOC);
return FALSE;
}
END_CATCH; EndWaitCursor();
SetModifiedFlag(FALSE);
if(!m_bSuccess) AfxMessageBox("无法保存BMP图像!!!!");
return m_bSuccess;
}