您当前位置:设计在线网 >> 矢量图像技术 >> 浏览文章

浅谈用vc 图像处理类

分享到:
本文章讲述了浅谈用vc 图像处理类.

上回书

说到了,用VC6.0单文档进行数字图像处理。但是,每次都是在一个View类的派生视图类上进行显示,看不出和源图像的对比性,为此,我们可以用CSplitterWnd类来讲单文档窗口分割为两个视图类,这样,左边的视图类显示源图像,右边的视图类就可以显示处理后的图像。这样对比性就一目了然了。也就是常说的用CSplitterWnd类来实现单文档多视图(一文档多视图)的效果。为此,我们还需要对我们的DIB类做一定的修改。

1、DIB类中需要两个保存像素数据的内存,一个存放源图像的像素数据,一个存放处理后图像的像素数据。并且要为它们各自设置一个取得指针和设置其像素数据的方法。

2、在DIB类的Read函数中,同时将源图像的像素数据复制到两个保存像素数据的内存,并在析构函数中对这两块内存进行删除。

3、两个视图类之间的切换。采用的CSplitterWnd类的对象的ActiveNext函数来实现,而且在两个视图类的OnDraw函数中绘制位图。

4、DIB类需要两个画图函数,以便在不同的视图类上画图。

主要程序如下:(下载全部源程序:http://download.csdn.net/source/1217835)

我新添加的派生于CView类的派生类名为CDstView类。

void CDstView::OnDraw(CDC* pDC)

{

/* CDocument* pDoc = GetDocument();*/

// TODO: add draw code here

CMainFrame *pMain=(CMainFrame*)AfxGetApp()->m_pMainWnd;

CVampireImageDoc *pDoc=(CVampireImageDoc*)pMain->GetActiveDocument() ;

if(pDoc->GetDibInstance()->m_bRead==TRUE)

{//如果已经读入位图,则显示位图

pDoc->GetDibInstance()->Draw(pDC);

}

}

CVampireImageDoc* CDstView::GetDocument()

{//重载GetDocument方法

return (CVampireImageDoc*)m_pDocument;

}

新的DIB类的全部源程序:

// Dib.h: interface for the CDib class.

//

////////////////////////////////////////////////// ////////////////////

#if !defined(AFX_DIB_H__1065C5DA_1C47_464F_A225_AAF8D2 F15064__INCLUDED_)

#define AFX_DIB_H__1065C5DA_1C47_464F_A225_AAF8D2F15064__I NCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

class CDib

{

public:

CDib();//构造函数

virtual ~CDib();//析构函数

private:

BITMAPFILEHEADER *m_pBmfh;

BYTE *m_pBmInfo;

BYTE *m_pPixel;

BITMAPINFOHEADER *m_pBmih;

BYTE *m_pPrev;

public:

BOOL m_bRead;

public:

int Read(CString filename);

void Draw(CDC *pDC);

void DrawPrev(CDC *pDC);//显示源图像

int Write(CString filename);

public:

DWORD GetWidth() const;

DWORD GetHeight() const;

WORD GetBitCount() const;

DWORD GetLineBytes() const;

BYTE* GetPixelPointer() const;//得到目的图像的像素矩阵的指针

void SetPixelMatrix(BYTE *newPixel);//设置目的图像的像素矩阵的指针

BYTE* GetPrevPixelPointer() const;//得到源图像的像素矩阵的指针

void SetPrevPixelMatrix(BYTE *newPixel);//设置源图像的像素矩阵的指针

};

#endif // !defined(AFX_DIB_H__1065C5DA_1C47_464F_A225_AAF8D2 F15064__INCLUDED_)

// Dib.cpp: implementation of the CDib class.

//

////////////////////////////////////////////////// ////////////////////

#include "stdafx.h"

#include "VampireImage.h"

#include "Dib.h"

#ifdef _DEBUG

#undef THIS_FILE

static char THIS_FILE[]=__FILE__;

#define new DEBUG_NEW

#endif

////////////////////////////////////////////////// ////////////////////

// Construction/Destruction

////////////////////////////////////////////////// ////////////////////

CDib::CDib()

{

m_pBmfh=new BITMAPFILEHEADER;

m_pBmih=new BITMAPINFOHEADER;

m_pBmInfo=NULL;

m_pPixel=NULL;

m_pPrev=NULL;

m_bRead=FALSE;

}

CDib::~CDib()

{

if(m_pBmfh)

{

delete m_pBmfh;

m_pBmfh=NULL;

}

if(m_pBmih)

{

delete m_pBmih;

m_pBmih=NULL;

}

if(m_pBmInfo)

{

delete[] m_pBmInfo;

m_pBmInfo=NULL;

}

if(m_pPixel)

{

delete[] m_pPixel;

m_pPixel=NULL;

}

if(m_pPrev)

{

delete[] m_pPrev;

m_pPrev=NULL;

}

}

//////////////////////////////////////////////

推荐阅读:
VC数字图像(BITMAP)处理编程讲座
数字图像处理领域的二十四个典型算法及vc实现
[转载]VC++在数字图像处理中的几点技巧与经验(转)
推荐文章  
赞助商链接  
热门排行  
主题推广  
中国设计在线网 All Rights Reserved. 互联网违法和不良信息举报
信息产业部备案号:湘ICP备09001063号