最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

利用VC实现AVI文件的图像截取

来源:动视网 责编:小OO 时间:2025-10-01 21:01:53
文档

利用VC实现AVI文件的图像截取

利用VC实现AVI文件的图像截取(加入日期:2001-10-24)【收藏文章】【对此文发表评论】【保存文章至硬盘】【打印文章】【字体:大中小】作者:刘涛来源:www.yesky.comAVI文件就是我们所说的多媒体文件,所谓的AVI图像就是视频图像,该文件是一个RIFF说明文件,它用于获取、编辑、演示音频、视频序列。一般的AVI文件包含音频流和视频流,有的特殊的AVI还包含一个控制路径或MIDI路径作为附加的数据流。现在播放AVI文件的软件很多,但大多无法从AVI视频文件中读取一帧图像并生成B
推荐度:
导读利用VC实现AVI文件的图像截取(加入日期:2001-10-24)【收藏文章】【对此文发表评论】【保存文章至硬盘】【打印文章】【字体:大中小】作者:刘涛来源:www.yesky.comAVI文件就是我们所说的多媒体文件,所谓的AVI图像就是视频图像,该文件是一个RIFF说明文件,它用于获取、编辑、演示音频、视频序列。一般的AVI文件包含音频流和视频流,有的特殊的AVI还包含一个控制路径或MIDI路径作为附加的数据流。现在播放AVI文件的软件很多,但大多无法从AVI视频文件中读取一帧图像并生成B
利用VC实现AVI文件的图像截取

(加入日期:2001-10-24)

【收藏文章】【对此文发表评论】【保存文章至硬盘】【打印文章】【字体:大 中 小】

作者: 刘涛

来源:www.yesky.com

AVI文件就是我们所说的多媒体文件,所谓的AVI图像就是视频图像,该文件是一个RIFF说明文件,它用于获取、编辑、演示音频、视频序列。一般的AVI文件包含音频流和视频流,有的特殊的AVI还包含一个控制路径或MIDI路径作为附加的数据流。

  现在播放AVI文件的软件很多,但大多无法从AVI视频文件中读取一帧图像并生成BMP格式的文件。笔者在使用AVI文件开发项目过程中对AVI文件的操作积累了一些经验,对于如何实现从AVI视频流中获取任意帧的图像数据并存储成BMP文件,其中最关键的是要从AVI文件中获取具体某一帧的图像数据,为此我利用Windows提供的API函数实现了自定义的CAvi类,用于操作AVI文件。

  在使用API函数操作AVI文件时,一定要注意用AVIFileInit()来初始化AVI库,程序结束时用AVIFileExit()释放AVI库,否则API函数无法使用。现以操作包含真彩色图像的AVI文件为例,给出Cavi类的部分函数的具体实现,其中CaviCreate()函数用于读取AVI文件信息并初始化Cavi类的成员,例如根据AVI文件信息定义每帧图像的宽、高、每帧图像的信息头结构等等;函数AviRead(int mFrame)用于从AVI文件中读取第mFrame帧。实现代码显示如下:

//Cavi类头文件定义;

class CAvi file://AVI类,处理AVI文件

{

 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);//用文件名初始化AVI类的成员

 virtual ~CAvi();

}; 

//Cavi类文件实现部分;

CAvi::CAvi()

{ AVIFileInit();//初始化AVI库

 cx=0;//定义图象宽、高、等成员

 cy=0;

 m_pBMI=NULL;

 pData=NULL;

 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://获取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, 

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环境下顺利编译通过,运行正常。 

文档

利用VC实现AVI文件的图像截取

利用VC实现AVI文件的图像截取(加入日期:2001-10-24)【收藏文章】【对此文发表评论】【保存文章至硬盘】【打印文章】【字体:大中小】作者:刘涛来源:www.yesky.comAVI文件就是我们所说的多媒体文件,所谓的AVI图像就是视频图像,该文件是一个RIFF说明文件,它用于获取、编辑、演示音频、视频序列。一般的AVI文件包含音频流和视频流,有的特殊的AVI还包含一个控制路径或MIDI路径作为附加的数据流。现在播放AVI文件的软件很多,但大多无法从AVI视频文件中读取一帧图像并生成B
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top