视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
VC环境下读取显示.bmp图像方法
2025-10-06 04:40:34 责编:小OO
文档
总结显示bmp图像的方法,列出四种显示方法。

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

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

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

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

下面分别对这四种方法进行详细描述:

首先新建VC工程ShowBmpImage->MFC->单文档模式。将显示的操作都是放在CShowBmpImageView下进行的,并且没有定义成员变量。

1 第一种方法

通过SetPixelShow()函数循环画出每个像素点,从而显示图像。操作如下:

增加成员函数SetPixelShow(),编辑代码如下:

i定义像素位置

C获取dc,也可以用CDC *pDC

for(x=0;x<200;x++)

 

           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(),编辑代码如下:

C定义一个CBitmap对象

b使其加载位图资源

C定义一个CDC对象,用于装载位图

m使其创建兼容DC,相当于初始化

CBitmap* pOldBmp = memDC.SelectObject (&bmp); // 与CBitmap对象关联起来,就获取位图了

B定义BITMAP对象

b使其与CBitmap对象绑定

i获取宽度

i获取高度

//CClientDC dc(this);

//dc.StretchBlt(0,0,nWidth,nHeight,&memDC,0,0,nWidth,nHeight,SRCCOPY);

C创建DC

p画图像

//pDC->StretchBlt(0,0,nWidth,nHeight,&memDC,0,0,nWidth,nHeight,SRCCOPY);

m选择回原来的资源

调用函数后,显示载入的位图。

3 第三种方法

通过读取本地的位图文件,再用固定的模式显示图像。操作如下:

增加成员函数FileLoad1(),ReadBmpFile1(CString filepathname),编辑代码如下:

void CShowBmpImageView::FileLoad1()

{

CString filename;

if(IDOK==dlg.DoModal())

{

 

   ReadBmpFile1(filename);       //获取到文件路径,加载bmp文件

}

else

{

 您取消操作");

}

}

void CShowBmpImageView::ReadBmpFile1(CString filepathname)

{

C定义CFile对象

if( !file.Open(filepathname, CFile::modeRead) )

 该文件打开出错");

l定义文件长度

nFileLen = file.GetLength();

B定义位图文件头

//读取位图文件头,大小为文件头的大小

if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))

 读取文件错误");

//判断文件的类型是否为bmp文件

if (bmfHeader.bfType != ((WORD)('M' <<8) | 'B'))

 该文件不是BMP文件");

//定义hDIB,并GlobalAlloc分配内存,用完后需要GlobalFree释放

HGLOBAL hDIB = ::GlobalAlloc(GMEM_FIXED, nFileLen);

//将文件读入到hDIB,大小为总长度减去文件头的长度

if (file.ReadHuge((LPSTR)hDIB, nFileLen - sizeof(BITMAPFILEHEADER)) !=

 

 读取文件错误");

//定义位图信息,并与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,

//下面即是位图显示的固定思路

//******************************************************************************

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);

//**************************************************************************

:解锁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;

if (dlg.DoModal()==IDOK)

{

 

   ReadBmpFile2(filename);    //获取到文件路径,加载bmp文件  

}

else

{

 您取消操作");

}

}

void CShowBmpImageView::ReadBmpFile2(CString filepathname)

{

B定义BMPFILE指针

b并分配内存

b初始化结构中的成员

bmpfile->pInfo=new tagBITMAPINFO;

C定义CFile对象

if(!file.Open(filepathname,CFile::modeRead))

 打开文件错误");

    long Filelen;    //定义文件长度

//读取位图文件头,大小为文件头的大小

 

 读取文件错误");

//判断文件的类型是否为bmp文件

if (bmpfile->pFileHeader->bfType != ((WORD)('M' <<8) | 'B'))

 该文件不是BMP文件");

//定义储存位图文件的buffer

bmpfile->buffer=new byte[Filelen];

//将文件读取到buffer中,大小为长度减去文件头

if(!file.ReadHuge(bmpfile->buffer,Filelen-sizeof(BITMAPFILEHEADER)))

 读取文件错误");

//创建位图信息,并与buffer绑定

bmpfile->pInfo=(tagBITMAPINFO *)(bmpfile->buffer);

//计算位图数据大小

 

f关闭文件

//**********************显示位图***************************************

CDC *pDC=GetDC();

HDC hdc=pDC->GetSafeHdc();

SetDIBitsToDevice(

   hdc,            //设备环境句柄

   0,             //目标区域的左上角x

   0,             //目标区域的左上角y

 资源文件的宽度

 资源文件的高度

   0,             //源文件左下角的x

   0,             //源文件左下角的y

   0,             //开始扫描的行号

 总共扫描行数

 字节形数组的颜色数据指针

 包含位图信息的位图信息指针

   DIB_RGB_COLORS          //RGB颜色表

 

f释放所有内存

}

调用函数后,弹出对话框,选择要显示的本地位图文件,显示。下载本文

显示全文
专题