怎样用VC++实现对24位bmp图像的打开和显示(bmp图片假定放在D盘picture文件夹内),以备后续的图像处理?

希望高手给出具体的源代码,我找了很多,不过都有错误。我是新手,不太会调试。也希望能给个VC++的调试类问题的网站。不甚感激!是在VS2008中,好像调试了下有很多错误也... 希望高手给出具体的源代码,我找了很多,不过都有错误。我是新手,不太会调试。也希望能给个VC++的调试类问题的网站。不甚感激!
是在VS2008中 ,好像调试了下 有很多错误也
展开
 我来答
wise_111
2010-04-20 · TA获得超过892个赞
知道小有建树答主
回答量:329
采纳率:0%
帮助的人:354万
展开全部
24位位图在VC++中需要三个结构来存储:
BITMAPFILEHEADER:文件信息头
LPBITMAPINFOHEADER:位图信息头指针
LPBYTE:像素数据指针

假设你的图片名为:“图片.bmp”。

1、你用VC++建立一个MFC(exe)工程,命名为“My”,在弹出的“MFC应用程序向导-步骤1”中选“单文档”,然后点“完成”->“确定”。

2、在“MyView.h”文件中找到代码“CMyDoc* GetDocument();”在其下方添加如下代码:
BITMAPINFOHEADER bmih;
LPBYTE pBits;
BOOL Read(char* s);

3、然后打开“MyView.cpp”文件,在最下面写如下代码:
BOOL CMyView::Read(char* s)
{
CFile file;
BITMAPFILEHEADER bmfh;

//打开文件
if(!file.Open(s,CFile::modeRead))
{
AfxMessageBox("File cannot open!");
return FALSE;
}

//读文件信息头
file.Read( (LPVOID)&bmfh, sizeof(bmfh) );
if(bmfh.bfType != 0x4d42)
{
AfxMessageBox("This is not a bmp file!");
return FALSE;
}

//读位图信息头
int infoSize = bmfh.bfOffBits - sizeof(bmfh);
bmih = (LPBITMAPINFOHEADER)new BYTE[infoSize];
file.Read( (LPVOID)bmih, infoSize);
if(bmih->biBitCount!=24)
{
AfxMessageBox("The number of colors is not valid!");
return FALSE;
}

//读图像数据
pBits = new BYTE[bmih->biSizeImage];
file.Read( (LPVOID)pBits, bmih->biSizeImage);

return TRUE;
}

4、往上找,找到构造函数:CMyView::CMyView()
在其中添加代码:
Read("d:\\picture\\图片.bmp");

5、往下找,找到OnDraw函数,在该函数的第三行添加代码:
if(bmih && pBits)
{
::StretchDIBits(pDC->GetSafeHdc(),0,0,bmih->biWidth,bmih->biHeight,0,0,bmih->biWidth,bmih->biHeight,pBits,(LPBITMAPINFO)bmih,DIB_RGB_COLORS,SRCCOPY);
}

运行即可。我已试过,可以打开并显示。希望你一步一步照做,代码不要写错!

http://wenku.baidu.com/view/550a8fd049649b6648d7478a.html
http://wenku.baidu.com/view/fe8ff04ffe4733687e21aa95.html
JUST_FANCY
2010-04-19 · 超过28用户采纳过TA的回答
知道答主
回答量:57
采纳率:0%
帮助的人:0
展开全部
GDI:
HBITMAP hbmp = (HBITMAP)LoadImage(NULL,TEXT("D:\\picture\\test.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);//装载位图
HDC hdc = GetDC(hWnd);//
HDC hdcMem = CreateCompatibleDC(hdc);
BITMAP bmp;
GetObject(hbmp, sizeof(BITMAP), &bmp);//获取位图信息
HBITMAP hbmpOld = (HBITMAP) SelectObject(hdcMem, hbmp);
BitBlt(hdc, 0, 0, bmp.bmWidth, bmp.bmHeight, hdcMem, 0, 0, SRCCOPY);//在窗口上画出位图

SelectObject(hdcMem, hbmpOld);
DeleteDC(hdcMem);
ReleaseDC(hWnd, hdc);

Gdi+:
HDC hdc = GetDC(hWnd);
Graphics g(hdc);

Image img(L"D:\\picture\\test.bmp");
g.DrawImage(&img, 0, 0, img.GetWidth(), img.GetHeight());
ReleaseDC(hWnd, hdc);

用Gdi+更简单一点,呵呵
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
kevin_6603
2010-04-19 · TA获得超过1116个赞
知道小有建树答主
回答量:388
采纳率:0%
帮助的人:214万
展开全部
这个其实网上的一般都可以用,手头到没现成的,说一下可能出现的情况吧, 一般有些代码里会设置图片的地址, 有的是直接在属性里添加的,所以要查看控件的属性,还有的会放在程序根目录下,你也可以尝试一下~ 或者直接把程序里带的图片直接用你的图片重命名替换掉~~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xukunlin2008
2010-04-19
知道答主
回答量:20
采纳率:0%
帮助的人:0
展开全部
用loadimage(文件,标位)加载
再用 DB操作
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式