2024年2月21日发(作者:)

VC++图像应用指南一——图像显示

一、设备上下文中绘制图像

1.穿建一个单文档/视图结构的应用程序 2.1在视图类的OnDraw编写如下代码

void COUtView::OnDraw(CDC* pDC)

{

COUtDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

CDC memDC;

CompatibleDC(pDC);

CBitmap bmp;

tmap(IDB_BKBITMAP);

Object(&bmp);

pDC->BitBlt(30,20,180,180,&memDC,1,1,S1.点击文件→选择新建→选择MFC APP ;填RCCOPY);

CRect rc(30,20,210,200);

写工程名;点击确认→

CBrush brush(RGB(0,0,0));

2.选择单文档→点击完成

pDC->FrameRect(rc,&brush);

2.2程序

Rect(220,0);

BITMAP BitInfo;

map(&BitInfo);

int x=h;

int y=ht;

pDC->StretchBlt(,,(),(),&memDC,0,0,x,y,SRCCOPY);

pDC->FrameRect(rc,&brush);

Object();

DC();

Object();

}

3.运行程序出现IDB_BKBITMAP不存在 4.成功运行程序

左图使用了BitBlt方法,在区域中只显示部分

图像;右图使用了SretchBlt方法,在区域中显示完整图像,图像被收缩了

二、从磁盘中加载图像到窗口中

1.穿建一个单文档/视图结构的应用程序 2.在视图类中添加一个成员变量m_hBmp

HANDLE m_hBmp

1.点击文件→选择新建→选择MFC APP ;填写工程名;点击确认→

2.选择单文档→点击完成

3.在视图类的构造函数中调用LoadImage方法从磁盘中加载文件

CMy456View::CMy456View()

{

m_hBmp=LoadImage(NULL,"",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

}

4.1在视图类中OnDraw方法中绘制位图,代码如下:

4.2程序

void CMy456View::OnDraw(CDC* pDC)

{

CMy456Doc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

CBitmap bmp;

(m_hBmp);

CDC memDC;

CompatibleDC(pDC);

Object(&bmp);

BITMAP BitInfo;

map(&BitInfo);

int x=h;

int y=ht;

pDC->BitBlt(0,0,x,y,&memDC,0,0,SRCCOPY);

();

DC();

}

5运行程序

三、显示JPEG图像

1.创建单文档/视图结构的应用程序 2.向视图类中添加成员变量

1.点击文件→选择新建→选择MFC APP ;填

写工程名;点击确认→

2.选择单文档→点击完成

HGLOBAL hMem;

OLE_YSIZE_HIMETRIC m_JPGHeight;

OLE_XSIZE_HIMETRIC m_JPGWidth;

IPicture *m_pPicture;

IStream *m_pStream;

3.视图构造函数中从磁盘加载JPEG图像到流CMy654View::CMy654View()

{CFile file;

("",CFile::modeReadWrite);

DWORD len=gth();

hMem=GlobalAlloc(GMEM_MOVEABLE,len);

LPVOID pData=NULL;

pData=GlobalLock(hMem);

ge(pData,len);

();

GlobalUnlock(hMem);

CreateStreamOnHGlobal(hMem,TRUE,&m_pStream);

OleLoadPicture(m_pStream,len,TRUE,IID_IPicture,(LPVOID*)&m_pPicture);

m_pPicture->get_Height(&m_JPGHeight);

m_pPicture->get_Width(&m_JPGWidth);}

4.在视图类OnDraw方法中绘制JPEG图像 5.运行

m_pPicture->Render(pDC->m_hDC,0,0,(int)(m_JPGWidth/26.45),(int)(m_JPGHeight/26.45),0,m_JPGHeight,m_JPGWidth,-m_JPGHeight,NULL);

四、根据位图数据直接绘图/使用SretchDIBits根据数据流绘制图像

1.创建单文档/视图结构的应用程序 2.在视图类中定义一个缓冲区,用于存储数据流

char *m_pBmpData;

1.点击文件→选择新建→选择MFC APP ;填写工程名;点击确认→

2.选择单文档→点击完成

3.1在视图类的构造函数中读取文件到数据流中

CMy627View::CMy627View()

{ CFile file;

("",CFile::modeReadWrite);

int len=gth();

(14,CFile::begin);

m_pBmpData=new char[len-14];

(m_pBmpData,len-14);

();}

4.1在视图类的析构函数中释放缓冲区

CMy627View::~CMy627View()

{

delete m_pBmpData;

}

4.2程序

3.2程序

5.1向视图类中添加一个成员函数,根据数据5.2程序

流输出图像

void CMy627View::OutputStream(char

*pStream)

{

char *pHeader=pStream;

BITMAPINFO BitInfo;

memset(&BitInfo,0,sizeof(BITMAPINFO));

memcpy(&BitInfo,pHeader,sizeof(BITMAPINFO));

int x=h;

int y=ht;

pHeader+=40;

StretchDIBits(GetDC()->m_hDC,0,0,x,y,0,0,x,y,pHeader,&BitInfo,DIB_RGB_COLORS,SRCCOPY);

}

6.在视图类的OnDraw方法中调用OutputSteam方法绘制图像

7.向程序中添加图像

void CMy627View::OnDraw(CDC* pDC)

{

CMy627Doc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

OutputStream(m_pBmpData);

}

8.成果运行程序