当前位置:文档之家› VC++图形图像处理源代码

VC++图形图像处理源代码


delete pData; pData=NULL;
if(m_pBMI!=NULL) delete m_pBMI; m_pBMI=NULL; if(pfi!=NULL)
delete pfi; pfi=NULL; } CAvi::CAviCreate(CString &string)//读文件初始化该类 { HRESULT hr; pfi=new AVIFILEINFO; hr = AVIFileOpen(&pfile, // returned file pointer string, // file name OF_READ, // mode to open file with NULL); hr= AVIFileInfo(pfile, file://获取 AVI 信息,放入 pfi 中 pfi, sizeof(AVIFILEINFO) ); cx=pfi­>dwWidth;//图象宽、高 cy=pfi­>dwHeight; hr=AVIFileGetStream(//将 AVI 变成视频流 pfile, &pavi, streamtypeVIDEO, 0//LONG lParam ); m_pBMI=new BITMAPINFO;//定义 BMP 信息头 m_pBMI­>bmiHeader.biBitCount=24; m_pBMI­>bmiHeader.biClrImportant=0; m_pBMI­>bmiHeader.biClrUsed=0; m_pBMI­>bmiHeader.biCompression=BI_RGB; m_pBMI­>bmiHeader.biHeight=cy; m_pBMI­>bmiHeader.biWidth=cx; m_pBMI­>bmiHeader.biPlanes=1; m_pBMI­>bmiHeader.biSize=sizeof(BITMAPINFOHEADER); m_pBMI­>bmiHeader.biXPelsPerMeter=0; m_pBMI­>bmiHeader.biYPelsPerMeter=0; m_pBMI­>bmiHeader.biSizeImage=cx*cy*3; pData=(BYTE*)new char[cx*cy*3];//根据 AVI 中 BMP 图象的信息定义缓冲区 } BOOL CAvi::AviRead(int mFrame)//将 AVI 文件的 M 帧数据读入 PData 缓冲区 { HRESULT hr; hr= AVIStreamRead( pavi, mFrame, 1, pData, cx*cy*3,
class CimageData : public CDaoRecordset { public: CimageData (CDaoDatabase* pDatabase =
NULL); DECLARE_DYNAMIC(CimageData) file://{{AFX_FIELD(CimageData, CDaoRecordset) CByteArray m_Images;// 声 明 字 节 数 组 用 来 存 放 图 像 数 据 file://}}AFX_FIELD // Overrides //
nColors=bmiHeader.biClrUsed ? bmiHeader.biClrUsed : 1 << bmiHeader.biBitCount; file://确定图像
的颜色数
}
void
CimageData::DoFieldExchange(CDaoFieldExchange*
pFX)
{ file://{{AFX_FIELD_MAP(CimageData) pFX­>SetFieldType(CDaoFieldExchange::outputColumn); DFX_Binary(pFX, _T("[Images]"), m_Images);//以二进制方式在 Images 字段和 m_Images 变量间
file://}}AFX_FIELD_INIT m_nDefaultType = dbOpenDynaset;// 以 动 态 集 方 式 打 开 数 据 库 }
CString CimageData::GetDefaultDBName() { return _T("E:\\IMAGES.mdb");//默认的 ACESS 数据 库在 E 盘,名为 IMAGES } CString CimageData::GetDefaultSQL() { return _T("[Table]");//默认打开数据库中名为"Table"的表
利用 Visual C++实现 AVI 文件的图像截取 AVI 文件就是我们所说的多媒体文件,所谓的 AVI 图像就是视频图像,该文件是一个 RIFF 说 明文件,它用于获取、编辑、演示音频、视频序列。一般的 AVI 文件包含音频流和视频流,有 的特殊的 AVI 还包含一个控制路径或 MIDI 路径作为附加的数据流。
DoFieldExchange(CDaoFieldExchange* pFX); file://}}AFX_VIRTUAL 该类的实现为:
CimageData::
CimageData
(CDaoDatabase*
pdb)
:
CDaoRecordset(pdb)
{ file://{{AFX_FIELD_INIT(CimageData) m_nFields = 1;// 数 据 库 的 表 中 仅 有 一 个 字 段
NULL, NULL ); if(hr==0) return TRUE; else return FALSE; }
上述 Cavi 类实现部分所涉及到的 API 函数可以参考微软提供的 MSDN。Cavi 类中的 pData 缓冲区存放 AVI 文件中的具体某一帧图像数据,同时 Cavi 类的 m_pBMI 为 BMP 图像文件信息 结构,这时可以根据图像的大小定义 BMP 图像文件头结构,关于 BMP 文件的存储,由于篇幅 的原因,我不在多讲了,有兴趣的读者可以参见笔者的拙作"Visual C++6.0 开发灰度位图处理" ( 天 极 网 软 件 栏 目 2001.9.10 发 表 ), 该 文 里 面 讲 述 了 如 何 存 取 BMP 文 件 。 以 上 程 序 在 Windows2000、Visual C++6.0 环境下顺利编译通过,运行正常。
Hale Waihona Puke Visual C++中实现对图像数据的读取显示 在利用 VC 进行数据库编程时,经常需要处理数据库中的图像数据,将该图像从数据库中读取 出来并显示,图像数据与文本字段不同,它是作为 OLE 字段在数据库中存储,通过数据集对象
的成员变量自动交换得到的图像数据,得到的数据并不能直接显示,如何处理图像数据,一直
据库,读取的图像数据显示在一个对话框上,至于使用 ODBC、DAO 还是 ADO,这要根据具
体情况而定,但无论使用哪一种,对图像的显示来说,实现的过程是大同小异的。由于篇幅有
限,文章中对如何实现数据库的连接不再作具体的说明,有兴趣的读者朋友可以参考 VC 数据 库编程的资料。实现过程中,首先定义一个 CDaoRecordset 的子类 CimageData 如下:
在使用 API 函数操作 AVI 文件时,一定要注意用 AVIFileInit()来初始化 AVI 库,程序结束时 用 AVIFileExit()释放 AVI 库,否则 API 函数无法使用。现以操作包含真彩色图像的 AVI 文件为 例,给出 Cavi 类的部分函数的具体实现,其中 CaviCreate()函数用于读取 AVI 文件信息并初始 化 Cavi 类的成员,例如根据 AVI 文件信息定义每帧图像的宽、高、每帧图像的信息头结构等等; 函数 AviRead(int mFrame)用于从 AVI 文件中读取第 mFrame 帧。实现代码显示如下:
交换数据 file://}}AFX_FIELD_MAP }
有了该类,就可以定义相应的对象来与数据库中的图像字段交换数据,下面定义的函数
GetImageData()说明了如何根据读取的 OLE 字段数据生成待显示的图像,需要注意的是该函数
中使用的 CBitmap 类的变量 Bitmap 是预定义的一个全局变量:
是数据库编程中的一个难点,目前关于 VC 进行数据库编程的资料不少,但很少涉及图像数据
的操作,笔者针对一现状,结合自己开发的一个项目,解决了如何显示数据库中的图像这一问
题,本文以操作 ACESS 数据库为例子,讲解一下自己的实现思路,希望对爱好 VC 编程的朋友
们有所帮助,以起到抛砖引玉的作用。
为了简化问题,该数据库的表中只有一个名为 Images 的 OLE 字段,我使用 DAO 连接操作数
现在播放 AVI 文件的软件很多,但大多无法从 AVI 视频文件中读取一帧图像并生成 BMP 格 式的文件。笔者在使用 AVI 文件开发项目过程中对 AVI 文件的操作积累了一些经验,对于如何 实现从 AVI 视频流中获取任意帧的图像数据并存储成 BMP 文件,其中最关键的是要从 AVI 文 件中获取具体某一帧的图像数据,为此我利用 Windows 提供的 API 函数实现了自定义的 CAvi 类,用于操作 AVI 文件。
息 的 起 始 位 置 Array.RemoveAt( 0, HeaderLen ); // 移 动 到 图 像 头 信 息 的 起 始 位 置
BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)Array.GetData() ; BITMAPINFO &bmInfo = *(LPBITMAPINFO)Array.GetData() ; file://得到图像数据的头信息 int
相关主题