关闭

avi录屏

标签: avi图形dll编程microsoftdelphi
1913人阅读 评论(1) 收藏 举报

软件开发的共享空间

电脑报远程教育中心 唐明理

  笔者染指程序多年,与朋友交流编程心得、在网上漫游搜寻编程资料、品味别人的共享模块,确实收益匪浅。事实上共享软件不仅仅存在于软件的应用阶段,在软件的开发研制中我们早已感到了共享给软件开发带来的好处。

  微软的Windows中给我们开放了成千上万个功能函数、VC的MFC中的类库可以让我们在程序中轻松实现不少的功能;还有在网上你可以找到更多的第三方资源,控件、DLL、类库和有关编程的好文章等等。虽然有些控件、DLL也需要少量的注册费,但人们还是乐意接收它,毕竟少量的钱可以加快自己的项目开发进度。

  笔者在这里给出一个基于VC-MFC的DLL库和使用方法,同时杜撰一些使用这个DLL的编程思路。可能并没有多高的技术含量,也算给新学编程的朋友们一个示范。这个DLL作为共享资源,不含任何标志,欢迎大家使用。

一、DDL的功能:

  一个基于VC-MFC的DLL库 AVIDIB.DLL。内含以下功能函数:

A、位图存取:
1.LPBITMAPINFOHEADER LoadBmp(CString fileName);
//调BMP图形文件:输入文件名,返回图像数据区指针
2.LPBITMAPINFOHEADER LoadTml(CString fileName);
//调自定义压缩图形文件:输入文件名,返回图像数据区指针
3.void SaveBmp(CString fileName,LPBITMAPINFOHEADER bi1);
//存贮BMP图形文件:输入:1文件名,2图像数据区指针
4.void SaveTml(CString fileName, LPBITMAPINFOHEADER bi1,
unsigned long mmio,);
//存贮自定义压缩位图文件:输入: 1存贮文件名,2图像数据区指针,3压缩格式

B、屏幕拷贝
1.LPBITMAPINFOHEADER CopyScreen();
//屏幕拷贝,返回图像数据区指针

C、将DIB位图序列存为AVI:
1.void AviFileOpen(LPCTSTR fileName,int Width,int Height ,
int ColorBits,int fps,unsigned long mmio);
//建立AVI文件:输入:1文件名,2图像宽,3图像高,4颜色深度,5回放速度每秒帧数,6压缩格式 (注:压缩格式为mmioFOURCC('t', 's', 'c', 'c')四字节表达式,mmio=0时为选择方式。)
2.BOOL AddFrame(DWORD mFrame,UCHAR *DataBuffer);
//向AVI中加入帧:输入1序号,2图像数据区指针
3.void AviFileClose();
//关闭建立的AVI文件
D、取AVI中的图:
1. int AviOpen(CString fileName);
//打开AVI文件,返回AVI中的帧数
2. LPBITMAPINFOHEADER AviRead(int mFrame)
//取AVI文件的M帧,返回图像数据区指针
3. void AviExit(); //关闭取图AVI

二、应用思路:
  有点编程经历的人已经看出这个DLL库的用途了。它可以做什么?下面笔者提出一些思路供大家参考。
  1、可以进行屏幕拷贝,并以BMP位图方式保存,还可以用一些压缩方式保存(800*600的一幅16位色位图,选用适当的压缩格式,可以压缩到只有10多K),当然从DLL中看到,还可以直接将屏幕拷贝的图形以AVI文件保存(也可以是压缩的AVI)。这就是现在市面上共享抓图软件的基本功能。微软曾经有一个叫作Microsoft Camcorder的屏幕拷贝程序,它的屏幕拷贝结果是一种特殊压缩格式的AVI,很小。用这个DLL做出来的效果可以和它相当。
  2、可以在现有的AVI文件中取出任意帧作为BMP(或压缩)文件保存;也可以将一序列的BMP文件生成AVI文件。当然还可以选择AVI的压缩方式。例如可以生成现在大家熟悉的高压缩比的MPG4格式的AVI文件。有了这些主要功能,不是可以做一个AVI文件编辑器了?如果你有兴趣,你可以做一个将数码图像组成AVI的家庭版软件。
  3、现在有的的教学软件将屏幕的操作过程抓下来进行回放,但在AVI的画面上叠加文字说明是一件麻烦的事情。用这个DLL的AVI单帧取图的方法在AVI的回放中加文字说明就是一个简单的事情了。
  4、有不少版本和格式的图形资料阅读工具深受人们的欢迎。你可以做一个播放屏幕操作过程的阅读工具,配以各种计算机认证考试的资料,只要你能有几篇做得好的教学辅导资料,相信这个阅读工具是会被人们接收的。

  当然只要动脑筋,这个DLL提供的功能一定可以做很多事的(悄悄话:一个朋友看到这里后说,他想搞一个后台屏幕监视软件,但一直嫌存贮量太大。现在可解决问题了。用一种专为屏幕拷贝图形压缩的TSCC压缩格式做的AVI文件;800*600的屏幕每秒存1帧,一分钟才450Kb ,一小时27000Kb。一秒钟就记录别人一下屏幕情况,还有什么看不到的?)。

  好,有了项目构思,有了关键模块。你可以试着策划你的项目了,别忘了一点,东西要做出来别人喜欢用,才有效益可言。

三、用法简介:

  下面介绍这个DLL的简单用法。黑体字部分是要在你的源程序中加入的。注:这个DLL只能在VC中使用(VB、Delphi中使用的版本容以后提供)。
用VC建立一个对话框模式的工程,例如工程名为Test。将笔者提供的三个文件avidib.dll、avidib.lib和avifile.h拷贝到你的工程目录下。
1.在Test的头文件CtestDlg.h中加入
#include "AviFile.h" //DLL的头文件引用
#pragma comment(lib," avidib.lib") //DLL的连接库引用
再加入公有类数据成员。
public:
CAviFile m_avi; //定义DLL的引用指针
2.在CtestDlg.cpp中加入一段自定义的显示函数
LPBITMAPINFOHEADER buf; //定义全局的图形指针变量
void CTestDlg::xianshi()
{ CClientDC dc(this);
if (buf==NULL) {return;} //没有图形返回
HDRAWDIB hdd = DrawDibOpen(); //打开DrawDib
if(!hdd) return; //失败返回
DrawDibDraw(hdd,dc.m_hDC,10,10,
buf->biWidth, buf->biHeight,
buf,NULL,0,0, buf->biWidth, buf->biHeight,0);
//在当前窗口的x=10,y=10处显示图形
DrawDibClose(hdd); //关闭DrawDib
}
不要忘记在头文件中定义这个函数。
下面我们就可以使用DLL库中的功能函数了。

A、屏幕拷贝:
1)拷贝一屏在当前目录下存为BMP文件
buf =m_avi.CopyScreen(); //拷贝一帧
m_avi.SaveBmp("test.bmp", buf); //存为BMP文件
2)拷贝一屏在当前目录下存为压缩图形文件
bi1=m_avi.CopyScreen();
m_avi.SaveTml("test.tml", buf, //拷贝一帧
mmioFOURCC('d', 'i', 'v', '3'));
//存为mpg4格式压缩文件
注1:在Windows目录下的system.ini文件[drivers32]项中可以看到你的系统已安装的各种视频压缩格式的四字节描述方法。这里选用的压缩格式是mpg4。
VIDC.MRLE=msrle32.dll //这是微软的8位色压缩
vidc.MSVC=msvidc32.dll //这是微软的16位色以上的压缩
vidc.DIV3=DIVXc32.dll //这就是常见的mpg4
vidc.DIV4=DIVXc32f.dll //用于快速画面的mpg4
VIDC.MJPG=Pvmjpg20.dll //这是一个jpg的压缩
VIDC.I263=C:/WINDOWS/SYSTEM/i263_32.drv
………
注2:压缩图形文件为笔者自定义的格式,文件后缀必为tml.
3)一秒钟拷贝一屏,连续拷贝20屏,存为mpg4格式的AVI文件
bi1=m_avi.CopyScreen();//先拷贝一帧,取得当前屏幕的数据
m_avi.AviFileOpen("test.avi", //在当前目录建立AVI文件
buf ->biWidth, //图宽
buf ->biHeight, //图高
buf ->biBitCount,//图色
1, //帧/秒
mmioFOURCC('d', 'i', 'v', '3'));
for(int i=0;i<20;i++) //循环20次
{ buf =m_avi.CopyScreen();//抓屏,返回图形指针
UCHAR *tmp;
tmp=(UCHAR *) buf +40; //数据前移40字节
m_avi.AddFrame(j,tmp); //将本帧图形加入AVI
Sleep(1000); //延时1秒
}
m_avi.AviFileClose(); //完毕,关闭新建的AVI
B、调入文件显示:
1) 调入压缩图形并显示
buf =m_avi.LoadTml("test.tml");//在当前目录调入压缩文件,
//返回图形指针
xianshi(); //调自己定义显示
2)调入AVI文件并显示
int len0=m_avi.AviOpen("test.avi");//在当前目录打开AVI
//文件,返回帧数
for(int i=0;i<len0;i++)
{ buf= m_avi.AviRead(i); //读取一帧
xianshi(); //显示
}
m_avi.AviExit(); //完毕,关闭

注:无论压缩与否的图形和取出的AVI图形,返回的图形数据是解压的与设备无关的DIB图形格式,你也可以用其它的方式在窗口上显示这些图形。

四、获取本文的相关资料:

  本文的三个文件:avidib.dll、avidib.lib、avifile.h
  欢迎大家下载:图形存贮.zip
  欢迎交流,作者信箱:tml@cpcw.com

 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:317231次
    • 积分:3588
    • 等级:
    • 排名:第9443名
    • 原创:33篇
    • 转载:185篇
    • 译文:0篇
    • 评论:28条
    文章分类
    最新评论