保存位图的问题?

dnaiel_zeng 2008-03-12 06:57:08
我想将一幅显示在客户区的位图另存为一幅位图,
但每次保存下来的文件都并不是bmp格式的文件,
这是我的源代码,各位高手能帮小弟看看么,小弟初学这玩意,谢谢了!!!


BOOL CDIBView::SaveBitmapFile(CString str_FileName)
{
BITMAPFILEHEADER bmfHdr;
LPBITMAPINFOHEADER lpBI = NULL;
DWORD dwDIBSize;
DWORD dwWritten;
HANDLE fh;

fh = CreateFile(str_FileName,
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL |
FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
if (fh == NULL)
{
return FALSE;
}

lpBI = (LPBITMAPINFOHEADER)m_lpbInfo;
if (lpBI == NULL)
{
CloseHandle(fh);
return FALSE;
}

if (lpBI->biSize != sizeof (BITMAPINFOHEADER))
{
CloseHandle(fh);
return FALSE;
}

bmfHdr.bfType = ((WORD) ('M' << 8) | 'B');

int iNumColor = 0;
if (lpBI->biClrUsed == 0)
{
if (lpBI->biBitCount <= 8)
{
iNumColor = 1 << lpBI->biBitCount;
}
}
else
{
iNumColor = lpBI->biClrUsed;
}

dwDIBSize = *(LPDWORD)lpBI + iNumColor * sizeof (RGBQUAD);

if ((lpBI->biCompression == BI_RLE8) ||
(lpBI->biCompression == BI_RLE4))
{
dwDIBSize += lpBI->biSizeImage;
}
else
{
DWORD dwBmBitsSize;
dwBmBitsSize = lpBI->biHeight *
((((lpBI->biWidth * lpBI->biBitCount) + 31) / 32) * 4);

dwDIBSize += dwBmBitsSize;

lpBI->biSizeImage = dwBmBitsSize;
}

bmfHdr.bfSize = dwDIBSize + sizeof (BITMAPFILEHEADER);
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;

bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) +
iNumColor * sizeof (RGBQUAD) +
lpBI->biSize;

WriteFile(fh, (LPBYTE)&bmfHdr, sizeof (BITMAPFILEHEADER),
&dwWritten, NULL);

WriteFile(fh, (LPBYTE)lpBI, dwDIBSize, &dwWritten, NULL);

return TRUE;
}
...全文
107 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dnaiel_zeng 2008-03-13
  • 打赏
  • 举报
回复
我弄明白了
9楼的谢谢你了,不过cfiledialog的构造函数中的第二个参数是可以直接添加扩展名的


CFileDialog dlg(false, "bmp", "未命名", OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY,
"DIB File(*.bmp) | *.* |All File(*.*) | *.*||",
AfxGetMainWnd( ));
这样就好了,
谢谢你们了哦,嘿嘿!

要谢谢五楼的提示,让我对CFileDialog有了个更高的认识,
给你们俩都加分,以后还希望多指点下小弟

小弟现在做机器视觉,要学这玩意,没办法,痛苦啊!
laoma_hbu 2008-03-13
  • 打赏
  • 举报
回复
你保存的数据是正确的,
但是你通过SaveBitmapFile(dlg.GetPathName())得到的文件名本身就是不含有扩展名的,所以保存后的文件
也不含文件名;好像CFileDialog本身不提供扩展名自动添加功能?

你需要对CFileDialog对象设置一个默认扩展名:
dlg.m_ofn.lpstrDefExt="bmp";
dnaiel_zeng 2008-03-13
  • 打赏
  • 举报
回复
5楼的能具体点吗
关于位图我才刚开始学


CFileDialog dlg(false, “.bmp”, "未命名1", OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY |
OFN_ALLOWMULTISELECT, "DIB File(*.bmp) | *.* |All File(*.*) | *.*||",
AfxGetMainWnd( ));
是这样设置吗?
dnaiel_zeng 2008-03-13
  • 打赏
  • 举报
回复
4楼的

我写了一个文件头
其他的数据我在第二个WriteFile中一次写进去的!
dnaiel_zeng 2008-03-13
  • 打赏
  • 举报
回复
4楼的

我写了一个文件头
其他的数据我在第二个WriteFile中一次写进去的!
scq2099yt 2008-03-13
  • 打赏
  • 举报
回复
在另存为对话框文件类型中增加bmp格式
ringphone 2008-03-13
  • 打赏
  • 举报
回复
SaveBitmapFile函数里面我怎么看你只写了个文件头,图象数据呢?
dnaiel_zeng 2008-03-13
  • 打赏
  • 举报
回复
对的啊我用另外的函数调用的

void CDIBView::OnBitmapSave()
{
// TODO: Add your command handler code here
CFileDialog dlg(false, NULL, "未命名1", OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY |
OFN_ALLOWMULTISELECT, "DIB File(*.bmp) | *.* |All File(*.*) | *.*||",
AfxGetMainWnd( ));
if (dlg.DoModal() == IDOK)
{
SaveBitmapFile(dlg.GetPathName());
}
}
love_lemon1984 2008-03-13
  • 打赏
  • 举报
回复
路过,学习...
laoma_hbu 2008-03-12
  • 打赏
  • 举报
回复
BOOL CDIBView::SaveBitmapFile(CString str_FileName)
str_FileName要传全称,
比如
c:\\temp.bmp
dnaiel_zeng 2008-03-12
  • 打赏
  • 举报
回复
THANKS ANBODY FOR HELPNESS
I AM A FRESHMEN IN THIS AREA
I AM INTRESETED IN THIS
THEREFORE I WANT TO LEARN MORE ABOUT THIS!!!

19,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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