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释放所有内存
}
调用函数后,弹出对话框,选择要显示的本地位图文件,显示。下载本文