VC环境下读取显示.bmp图像方法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VC环境下读取显示.bmp图像方法
总结显示bmp图像的方法,列出四种显示方法。

1 通过SetPixel()函数画出每个像素点来显示图像。

2 通过读取位图资源中bmp资源显示图像。

3 通过读取本地文件,利用位图结构信息,定义HGLOBAL,再采用固定的显示方式显示位图。

4 通过读取本地文件,利用位图结构信息,定义buffer,再采用SetDIBitsT oDevice()函数。

下面分别对这四种方法进行详细描述:首先新建VC工程ShowBmpImage->MFC->单文档模式。

将显示的操作都是放在CShowBmpImageView下进行的,并且没有定义成员变量。

1 第一种方法
通过SetPixelShow()函数循环画出每个像素点,从而显示图像。

操作如下:
增加成员函数SetPixelShow(),编辑代码如下:
int x,y; //定义像素位置CClientDC dc(this); //获取dc,也可以用CDC *pDC
for(x=0;x<200;x++)
for(y=0;y<200;y++)
dc.SetPixel(x,y,RGB(x,y,255)); //画一个像素点,RGB是颜色
调用函数后,显示的是一幅彩色图像,可以根据需要改变RGB的值来显示一幅完整的图像。

2 第二种方法
通过读取位图资源中的位图显示图像,选择菜单栏->插入->资源,弹出对话框,选择导入按钮,将文件类型改成所有文件,选择想要显示bmp位图,导入。

这样工程的资源位图中,导入的位图默认的ID 是IDB_BITMAP1。

而显示这种位图有一个固定的显示模式,非常方便。

方法如下:
a 定义一个CBitmap对象,使其加载位图资源。

b 定义一个CDC对象,用于装载位图;
使其创建兼容DC,相当于初始化;
与CBitmap对象关联起来,相当于获取位图。

c 定义BITMAP对象,使其与CBitmap对象绑定,可以获取宽度和高度。

d 创建DC,画图像。

e 选择回原来的资源。

操作如下:
增加成员函数LoadResShow(),编辑代码如下:
CBitmap bmp; //1.定义一个CBitmap对象
bmp.LoadBitmap(IDB_BITMAP1); // 使其加载位图资源
CDC memDC; //2.定义一个CDC对象,用于装载位图
memDC.CreateCompatibleDC (NULL); // 使其创建兼容DC,相当于初始化
CBitmap* pOldBmp = memDC.SelectObject (&bmp); // 与CBitmap对象关联起来,就获取位图了
BITMAP bm; //3.定义BITMAP对象
bmp.GetBitmap (&bm); // 使其与CBitmap对象绑定
int nWidth = bm.bmWidth; // 获取宽度
int nHeight = bm.bmHeight; // 获取高度
//CClientDC dc(this);
//dc.StretchBlt(0,0,nWidth,nHeight,&memDC,0,0,nWidth,nH eight,SRCCOPY);
CDC *pDC=GetDC(); //4.创建DC
pDC->BitBlt(0,0,nWidth,nHeight,&memDC,0,0,SRCCOPY); // 画图像
//pDC->StretchBlt(0,0,nWidth,nHeight,&memDC,0,0,nWidth ,nHeight,SRCCOPY);
memDC.SelectObject(pOldBmp); //5.选择回原来的资源
调用函数后,显示载入的位图。

3 第三种方法
通过读取本地的位图文件,再用固定的模式显示图像。

操作如下:增加成员函数FileLoad1(),ReadBmpFile1(CString filepathname),编辑代码如下:void CShowBmpImageView::FileLoad1()
{
CString filename;
CFileDialog dlg(true,"*.bmp",NULL,NULL,"(Bmp File)*.bmp|*.bmp||");
if(IDOK==dlg.DoModal())
{
filename=dlg.GetPathName();
ReadBmpFile1(filename); //获取到文件路径,加载bmp文件
}
else
{
MessageBox("您取消操作");
}
}
void CShowBmpImageView::ReadBmpFile1(CString filepathname)
{
CFile file; //定义CFile对象
if( !file.Open(filepathname, CFile::modeRead) )
MessageBox("该文件打开出错");
long nFileLen; //定义文件长度
nFileLen = file.GetLength();
BITMAPFILEHEADER bmfHeader; //定义位图文件头
//读取位图文件头,大小为文件头的大小
if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) !=
sizeof(bmfHeader)) MessageBox("读取文件错误");
//判断文件的类型是否为bmp文件
if (bmfHeader.bfType != ((WORD)('M' <<8) | 'B'))
MessageBox("该文件不是BMP文件");
//定义hDIB,并GlobalAlloc分配内存,用完后需要GlobalFree 释放
HGLOBAL hDIB = ::GlobalAlloc(GMEM_FIXED, nFileLen);
//将文件读入到hDIB,大小为总长度减去文件头的长度
if (file.ReadHuge((LPSTR)hDIB, nFileLen - sizeof(BITMAPFILEHEADER)) != nFileLen - sizeof(BITMAPFILEHEADER) )
MessageBox("读取文件错误");
//定义位图信息,并与hDIB捆绑
BITMAPINFO &bmInfo = *(LPBITMAPINFO) ::GlobalLock(hDIB) ;
//定义位图信息头,并连接hDIB
BITMAPINFOHEADER *pInfoHead = (BITMAPINFOHEADER *)hDIB;
//计算bmp文件Buffer大小
BYTE *pBmpPixelBuffer=(BYTE *)&bmInfo+bmfHeader.bfOffBits-sizeof(BITMAPFILEHEADER);
//创建dc,并初始化
CDC dc;
dc.CreateDC("DISPLAY",NULL,NULL,NULL);
//定义HBITMAP对象,并与dc和位图关联,此对象就是现有的位图资源
HBITMAP hBitmap;
hBitmap=CreateDIBitmap(dc.m_hDC,(BITMAPINFOHEADER *)&bmInfo,
CBM_INIT,(VOID
*)pBmpPixelBuffer,&bmInfo,DIB_RGB_COLORS);
//下面即是位图显示的固定思路
//************************************************************* **************** *
CBitmap bmp;
bmp.Attach(hBitmap);
CDC memDC;
memDC.CreateCompatibleDC (NULL);
CBitmap* pOldBmp = memDC.SelectObject (&bmp);
BITMAP bm;
bmp.GetBitmap (&bm);
int nWidth = bm.bmWidth;
int nHeight = bm.bmHeight;
CDC* pDC = GetDC();
pDC->BitBlt (0,0,nWidth,nHeight,&memDC,0,0,SRCCOPY);
memDC.SelectObject (pOldBmp);
//************************************************************* *************
::GlobalUnlock (hDIB); //解锁hDIB
::GlobalFree(hDIB); //释放hDIB
}
调用函数后,弹出对话框,选择要显示的本地位图文件,显示。

4 第四种方法
通过读取本地位图文件,再采用SetDIBitsToDevice()函数显示图像,操作如下:
在头文件中定义位图结构,在ShowBmpImageView.h文件的开头,在定义类CShowBmpImageView之前加入
//**************定义位图文件结构*******************************
struct BMPFILE
{
tagBITMAPINFO *pInfo;
BITMAPFILEHEADER *pFileHeader;
BYTE *buffer;
BYTE *PToData;
};
//***********将文件头和位图信息封装****************************
增加成员函数FileLoad2(),ReadBmpFile2(CString filepathname),编辑代码如下:
void CShowBmpImageView::FileLoad2()
{
CString filename;
CFileDialog
dlg(true,"*.bmp",NULL,NULL,"(BmpFile)*.bmp|*.bmp||");
if (dlg.DoModal()==IDOK)
{
filename=dlg.GetPathName();
ReadBmpFile2(filename); //获取到文件路径,加载bmp文件
}
else
{
MessageBox("您取消操作");
}
}
void CShowBmpImageView::ReadBmpFile2(CString filepathname)
{
BMPFILE *bmpfile; //定义BMPFILE指针
bmpfile=(BMPFILE *)malloc(sizeof(BMPFILE)); //并分配内存
bmpfile->pFileHeader=new BITMAPFILEHEADER; //初始化结构中的成员
bmpfile->pInfo=new tagBITMAPINFO;
CFile file; //定义CFile对象
if(!file.Open(filepathname,CFile::modeRead))
MessageBox("打开文件错误");
long Filelen; //定义文件长度
Filelen=file.GetLength();
//读取位图文件头,大小为文件头的大小
if(!file.Read(bmpfile->pFileHeader,sizeof(BITMAPFILEHEADE R)))
MessageBox("读取文件错误");
//判断文件的类型是否为bmp文件
if (bmpfile->pFileHeader->bfType != ((WORD)('M' <<8) | 'B')) MessageBox("该文件不是BMP文件");
//定义储存位图文件的buffer
bmpfile->buffer=new byte[Filelen];
//将文件读取到buffer中,大小为长度减去文件头
if(!file.ReadHuge(bmpfile->buffer,Filelen-
sizeof(BITMAPFILEHEADER))) MessageBox("读取文件错误");
//创建位图信息,并与buffer绑定
bmpfile->pInfo=(tagBITMAPINFO *)(bmpfile->buffer);
//计算位图数据大小
bmpfile->PT oData=bmpfile->buffer+bmpfile->pFileHeader ->bfOffBits-sizeof(BITMAPFILEHE ADER);
file.Close(); //关闭文件
//**********************显示位图***************************************
CDC *pDC=GetDC();
HDC hdc=pDC->GetSafeHdc();
SetDIBitsT oDevice(
hdc, //设备环境句柄
0, //目标区域的左上角x
0, //目标区域的左上角y
bmpfile->pInfo->bmiHeader.biWidth, //资源文件的宽度
bmpfile->pInfo->bmiHeader.biHeight, //资源文件的高度
0, //源文件左下角的x
0, //源文件左下角的y
0, //开始扫描的行号
bmpfile->pInfo->bmiHeader.biHeight, //总共扫描行数
bmpfile->PT oData, //字节形数组的颜色数据指针
bmpfile->pInfo, //包含位图信息的位图信息指针
DIB_RGB_COLORS //RGB颜色表
);
//************************************************************* *********** free(bmpfile); //释放所有内存
}
调用函数后,弹出对话框,选择要显示的本地位图文件,显示。

相关文档
最新文档