【求助】这几句MFC语句如何改为非MFC的C++语句??

southbirdfly 2011-04-03 09:26:14
原函数如下:
bool CDXGraph::SnapshotBitmap(const char * outFile)
{
if (mBasicVideo)
{
long bitmapSize = 0;
if (SUCCEEDED(mBasicVideo->GetCurrentImage(&bitmapSize, 0)))
{
bool pass = false;
unsigned char * buffer = new unsigned char[bitmapSize];
if (SUCCEEDED(mBasicVideo->GetCurrentImage(&bitmapSize, (long *)buffer)))
{
BITMAPFILEHEADER hdr;
LPBITMAPINFOHEADER lpbi;

lpbi = (LPBITMAPINFOHEADER)buffer;

unsigned __int64 nColors = (unsigned __int64 )1 << lpbi->biBitCount;
if (nColors > 256 || 32 == lpbi->biBitCount)
nColors = 0;

hdr.bfType = ((WORD) ('M' << 8) | 'B'); //always is "BM"
hdr.bfSize = bitmapSize + sizeof( hdr );
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;
hdr.bfOffBits = (DWORD) (sizeof(BITMAPFILEHEADER) + lpbi->biSize +
nColors * sizeof(RGBQUAD));

CFile bitmapFile(outFile, CFile::modeReadWrite | CFile::modeCreate | CFile::typeBinary);
bitmapFile.Write(&hdr, sizeof(BITMAPFILEHEADER));
bitmapFile.Write(buffer, bitmapSize);
bitmapFile.Close();
ofstream bmpFile(outFile, ios::in | ios::out | ios::binary);


pass = true;
}
delete [] buffer;
return pass;
}
}
return false;
}


其中用到MFC的是以下几句:

[code=C/C++]CFile bitmapFile(outFile, CFile::modeReadWrite | CFile::modeCreate | CFile::typeBinary);
bitmapFile.Write(&hdr, sizeof(BITMAPFILEHEADER));
bitmapFile.Write(buffer, bitmapSize);
bitmapFile.Close();
[/code]

我现在不想用MFC,所以需要改写这几句,我改为了如下语句,但不起作用,图片没有保存下来。

ofstream  bmpFile(outFile, ios::in | ios::out | ios::binary);
bmpFile.write((char*)&hdr, sizeof(BITMAPFILEHEADER));
bmpFile.write((char*)buffer, bitmapSize);
bmpFile.close();


求指教


...全文
85 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wks19891215 2013-05-10
  • 打赏
  • 举报
回复
楼主,就上面的那段MFC代码,想请教一个问题。 SnapshotBitmap函数传递的参数是const char * outFile ,此处的outFile是一个文件名对吧。 在这个函数的执行过程中,文件名没被更改,而它指向的内容更改了。是否可以这样理解? 不然的话说不通const。。。
southbirdfly 2011-04-03
  • 打赏
  • 举报
回复
呵呵,解决了,谢谢楼上的各位。要结贴了
delphiwcdj 2011-04-03
  • 打赏
  • 举报
回复
改为:试试
fstream bmpFile(outFile, ios::in | ios::out | ios::binary);
pengzhixi 2011-04-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 arong1234 的回复:]
是没有in而不是out,要改成
ofstream bmpFile(outFile, ios::out | ios::binary);


引用 5 楼 pengzhixi 的回复:
ofstream bmpFile(outFile, ios::in | ios::binary);
[/Quote]
多谢纠正,哎 方式记错了
delphiwcdj 2011-04-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 arong1234 的回复:]

是没有in而不是out,要改成
ofstream bmpFile(outFile, ios::out | ios::binary);

引用 5 楼 pengzhixi 的回复:
ofstream bmpFile(outFile, ios::in | ios::binary);
[/Quote]
正解
delphiwcdj 2011-04-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pengzhixi 的回复:]

ofstream bmpFile(outFile, ios::in | ios::out | ios::binary);
ofstream是没有out的
[/Quote]
ios::out   = 0x02, //供写,文件不存在则创建,若文件已存在则清空原内容(ofstream默认的打开方式)
arong1234 2011-04-03
  • 打赏
  • 举报
回复
是没有in而不是out,要改成
ofstream bmpFile(outFile, ios::out | ios::binary);

[Quote=引用 5 楼 pengzhixi 的回复:]
ofstream bmpFile(outFile, ios::in | ios::binary);
[/Quote]
delphiwcdj 2011-04-03
  • 打赏
  • 举报
回复
调试进去看看,检查下每个函数的返回值是多少,是否出错
pengzhixi 2011-04-03
  • 打赏
  • 举报
回复
ofstream bmpFile(outFile, ios::in | ios::binary);
pengzhixi 2011-04-03
  • 打赏
  • 举报
回复
ofstream bmpFile(outFile, ios::in | ios::out | ios::binary);
ofstream是没有out的
Proteas 2011-04-03
  • 打赏
  • 举报
回复
用 C 的函数写呢,FILE ,write
southbirdfly 2011-04-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 luciferisnotsatan 的回复:]

有没有数据写到文件里?
有的话,拿beyondcompare或别的工具,二进制比较下两个文件是否相同。
没有数据写到文件里,调试看看write执行成功没
[/Quote]
调用的语句是这样的:
char  szTemp[] = "C:\\mysnapshot.bmp";
if (mFilterGraph->SnapshotBitmap(szTemp))
{
// User can browser for a new file here
CString strFilter = "BMP File (*.bmp)|*.bmp|";
CFileDialog dlgOpen(FALSE, ".bmp", NULL, OFN_HIDEREADONLY, strFilter, NULL);
if (IDOK == dlgOpen.DoModal())
{
::CopyFile(szTemp, dlgOpen.GetPathName(), FALSE);
::DeleteFile(szTemp);
}
}


当用MFC的方式时,执行完mFilterGraph->SnapshotBitmap(szTemp)这一步,会在C盘出现mysnapshot.bmp的图片,但用我写的方式执行,则没有图片的生成。
luciferisnotsatan 2011-04-03
  • 打赏
  • 举报
回复
有没有数据写到文件里?
有的话,拿beyondcompare或别的工具,二进制比较下两个文件是否相同。
没有数据写到文件里,调试看看write执行成功没

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧