保存位图的问题?

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;
}
...全文
90 11 打赏 收藏 举报
写回复
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!!!
相关推荐

我将带领大家来系统学习Windows的窗口编程,包括消息、窗口、GDI绘图、游戏开发等。

本课程比较基础,非常适合初学者入门,读者可以边学习边实践。

具体的章节目录和课程内容如下所示:

---------------------------------------------

Windows游戏编程系列之1:

GUI界面编程及游戏入门实战

1、Windows创建第一个窗口 

WinMain入口函数 5

进行Windows编程的调试手法 6

窗口从哪里来? 7

窗口编程的步骤 7

窗口编程需要的主要结构 8

窗口编程需要的主要API 9

2、Windows的窗口过程与消息机制 

如何留住窗口? 12

1)Windows的消息与消息循环 14

2)消息处理函数与常用消息 17

)Windows的窗口过程函数 19

 

3、GDI编程之设备上下文 

1)GDI的通用编程框架 22

2)GDI的绘图步骤 25

3)GDI获取设备句柄 25

4、GDI编程之绘制几何图形 

画点、线 28

颜色COLORREF 29

矩形 29

画圆、饼图、弦图 30

5、GDI编程之自定义画笔画刷

画笔简介 32

画刷简介 33

画笔案例 33

画刷案例 34

6、GDI编程之绘制文字 

DrawText函数 35

TextOut 函数 (wingdi.h) 36

CreateFont函数 37

绘制文本案例 37

7、GDI编程之绘制位图 

位图简介 38

1)在资源中添加位图资源 39

2)从资源中加载位图: LoadBitmap 39

3)创建一个与当前DC相匹配的DC(内存DC) 39

4)将bitmap放入匹配的DC中:SelectObject 40

5)成像(1:1 比例 ) 40

6)取出位图 40

7)释放位图 41

8)释放匹配的DC 41

绘制位图案例 41

 

 

 

8、Windows鼠标键盘消息 

一、键盘消息 42

1、键盘消息 42

2、消息参数: 42

3、消息的使用: 42

4、键盘消息的案例代码 43

二、鼠标消息 44

1、基本鼠标消息 44

2、双击消息 44

3、滚轮消息 45

4、不响应双击消息 45

 

9、Windows定时器消息 

定时器消息介绍 47

创建定时器 47

关闭定时器 47

定时器消息案例代码 48

10、GDI游戏之跳舞动画 

11、GDI游戏之走路动画 

12、GDI贪吃蛇游戏实战 

 

发帖
图形处理/算法

1.9w+

社区成员

VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
帖子事件
创建了帖子
2008-03-12 06:57
社区公告
暂无公告