没有合适的资源?快使用搜索试试~ 我知道了~
利用Visual C++实现AVI文件的图像截取,Visual C++中实现对图像数据的读取显示,Visual C++实现视频图像处理技术,相关源程序均在这里。
资源推荐
资源详情
资源评论
http://www.mvonline.com.cn 机器视觉在线(网络收集)
利用 Visual C++实现 AV I 文件的图像截取
AV I 文件就是我们所说的多媒体文件,所谓的 AVI 图像就是视频图像,该文件是一个
RIFF 说明文件,它用于获取、编辑、演示音频、视频序列。一般的 AV I 文件包含音频流和
视频流,有的特殊的 AV I 还包含一个控制路径或 MIDI 路径作为附加的数据流。
现在播放AV I 文件的软件很多,但大多无法从AV I 视频文件中读取一帧图像并生成BMP
格式的文件。笔者在使用 AV I 文件开发项目过程中对 AV I 文件的操作积累了一些经验,对
于如何实现从 AV I 视频流中获取任意帧的图像数据并存储成 BMP 文件,其中最关键的是要
从 AV I 文件中获取具体某一帧的图像数据,为此我利用 Windows 提供的 API 函数实现了自
定义的 CAvi 类,用于操作 AV I 文件。
在使用 API 函数操作 AVI 文件时,一定要注意用 AVIFileInit()来初始化 AV I 库,程序结
束时用 AVIFileExit()释放 AV I 库,否则 API 函数无法使用。现以操作包含真彩色图像的 AVI
文件为例,给出 Cavi 类的部分函数的具体实现,其中 CaviCreate()函数用于读取 AV I 文件信
息并初始化 Cavi 类的成员,例如根据 AV I 文件信息定义每帧图像的宽、高、每帧图像的信
息头结构等等;函数 AviRead(int mFrame)用于从 AV I 文件中读取第 mFrame 帧。实现代码显
示如下:
//Cavi 类头文件定义;
class CAvi file://AVI 类,处理 AV I 文件
{
public:
int cy;//图象高
int cx;//图象宽
file://long m_maxFrame;
BYTE *pData;//寸储图象数据
BITMAPINFO *m_pBMI;//位图文件信息头
PAVISTREAM pavi;//AVI 流
PAVIFILE pfile;//AVI 文件指针
AVIFILEINFO * pfi; file://AVI 信息
BOOL AviRead(int mFrame);//读 AVI 文件的第 mFrame 帧
CAvi();//标准构造函数
CAviCreate(CString &string);//用文件名初始化 AV I 类的成员
virtual ~CAvi();
};
//Cavi 类文件实现部分;
CAvi::CAvi()
{ AVIFileInit();//初始化 AV I 库
cx=0;//定义图象宽、高、等成员
cy=0;
m_pBMI=NULL;
pData=NULL;
http://www.mvonline.com.cn 机器视觉在线(网络收集)
file://m_maxFrame=0;
pfi=NULL;
}
CAvi::~CAvi()//析构、释放指针
{
// AVIFileClose(pfile);
AVIFileExit();
if(pData!=NULL)
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://获取 AV I 信息,放入 pfi 中
pfi,
sizeof(AVIFILEINFO)
);
cx=pfi->dwWidth;//图象宽、高
cy=pfi->dwHeight;
hr=AVIFileGetStream(//将 AV I 变成视频流
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;
http://www.mvonline.com.cn 机器视觉在线(网络收集)
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];//根据 AV I 中 BMP 图象的信息定义缓冲区
}
BOOL CAvi::AviRead(int mFrame)//将 AV I 文件的 M 帧数据读入 PData 缓冲区
{
HRESULT hr;
hr= AVIStreamRead( pavi,
mFrame,
1,
pData,
cx*cy*3,
NULL,
NULL
);
if(hr==0)
return TRUE;
else
return FALSE;
}
上述Cavi 类实现部分所涉及到的 API 函数可以参考微软提供的 MSDN。Cavi 类中的
pData 缓冲区存放 AV I 文件中的具体某一帧图像数据,同时 Cavi 类的 m_pBMI 为 BMP 图像
文件信息结构,这时可以根据图像的大小定义 BMP 图像文件头结构,关于 BMP 文件的存
储,由于篇幅的原因,我不在多讲了,有兴趣的读者可以参见笔者的拙作"Visual C++6.0 开
发灰度位图处理"(天极网软件栏目 2001.9.10 发表),该文里面讲述了如何存取 BMP 文件。
以上程序在 Windows2000、Visual C++6.0 环境下顺利编译通过,运行正常。
Visual C++中实现对图像数据的读取显示
在利用 VC 进行数据库编程时,经常需要处理数据库中的图像数据,将该图像从数据库
中读取出来并显示,图像数据与文本字段不同,它是作为 OLE 字段在数据库中存储,通过
数据集对象的成员变量自动交换得到的图像数据,得到的数据并不能直接显示,如何处理图
像数据,一直是数据库编程中的一个难点,目前关于 VC 进行数据库编程的资料不少,但很
少涉及图像数据的操作,笔者针对一现状,结合自己开发的一个项目,解决了如何显示数据
库中的图像这一问题,本文以操作 ACESS 数据库为例子,讲解一下自己的实现思路,希望
对爱好 VC 编程的朋友们有所帮助,以起到抛砖引玉的作用。
http://www.mvonline.com.cn 机器视觉在线(网络收集)
为了简化问题,该数据库的表中只有一个名为 Images 的 OLE 字段,我使用 DAO 连接操
作数据库,读取的图像数据显示在一个对话框上,至于使用 ODBC、DAO 还是 ADO,这要根据
具体情况而定,但无论使用哪一种,对图像的显示来说,实现的过程是大同小异的。由于篇
幅有限,文章中对如何实现数据库的连接不再作具体的说明,有兴趣的读者朋友可以参考 V
C 数据库编程的资料。实现过程中,首先定义一个 CDaoRecordset 的子类 CimageData 如下:
class CimageData : public CDaoRecordset
{
public:
CimageData (CDaoDatabase* pDatabase = NULL);
DECLARE_DYNAMIC(CimageData)
file:
//{{AFX_FIELD(CimageData, CDaoRecordset)
CByteArray m_Images;//声明字节数组用来存放图像数据
file:
//}}AFX_FIELD
// Overrides
// ClassWizard generated virtual function overrides
file:
//{{AFX_VIRTUAL(CimageData)
public:
virtual CString GetDefaultDBName();
virtual CString GetDefaultSQL();
virtual void DoFieldExchange(CDaoFieldExchange* pFX);
file:
//}}AFX_VIRTUAL
该类的实现为:
CimageData:: CimageData (CDaoDatabase* pdb)
: CDaoRecordset(pdb)
{
file:
//{{AFX_FIELD_INIT(CimageData)
m_nFields = 1;//数据库的表中仅有一个字段
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"的表
}
void CimageData::DoFieldExchange(CDaoFieldExchange* pFX)
{
http://www.mvonline.com.cn 机器视觉在线(网络收集)
file:
//{{AFX_FIELD_MAP(CimageData)
pFX->SetFieldType(CDaoFieldExchange::outputColumn);
DFX_Binary(pFX, _T("[Images]"), m_Images);//以二进制方式在 Images 字段和 m_Images
变量间交换数据
file:
//}}AFX_FIELD_MAP
}
有了该类,就可以定义相应的对象来与数据库中的图像字段交换数据,下面定义的函数
GetImageData()说明了如何根据读取的 OLE 字段数据生成待显示的图像,需要注意的是该函
数中使用的 CBitmap 类的变量 Bitmap 是预定义的一个全局变量:
BOOL CImageDlg:: GetImageData(CByteArray & DBArray)
{
CByteArray Array;
Array.Copy( DBArray);
int HeaderLen = 78 + sizeof(BITMAPFILEHEADER);
file:
//确定图像头信息的起始位置
Array.RemoveAt( 0, HeaderLen ); // 移动到图像头信息的起始位置
BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)Array.GetData() ;
BITMAPINFO &bmInfo = *(LPBITMAPINFO)Array.GetData() ;
file:
//得到图像数据的头信息
int nColors=bmiHeader.biClrUsed ? bmiHeader.biClrUsed : 1 << bmiHeader.biBitCou
nt;
file:
//确定图像的颜色数
LPVOID lpDIBBits;
if( bmInfo.bmiHeader.biBitCount > 8 )
lpDIBBits=(LPVOID)((LPDWORD)(bmInfo.bmiColors+bmInfo.bmiHeader.biClrUsed)+
((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0));
else
lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);
file:
//得到图像各个像素的具体数据
CClientDC dc(NULL);
HBITMAP hBmp = CreateDIBitmap( dc.m_hDC,
&bmiHeader,
CBM_INIT,
lpDIBBits,
&bmInfo,
DIB_RGB_COLORS);
file:
//生成位图句柄
Bitmap.Attach( hBmp );//将该句柄与定义的 Bitmap 对象联系在一起
Array.RemoveAll();
file:
//释放内存
return TRUE;
剩余84页未读,继续阅读
资源评论
zhangziye1014
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功