一个实用的图形存储转换DLL
软件世界
我们都知道,现代编程是按模块进行的。对于学习VC编程,掌握和用好DLL(动态链接库)是至关重要的。
笔者在这里给出一个基于VC-MFC的DLL库和使用方法,同时杜撰一些使用这个DLL的编程思路。它可能并没有多高的技术含量,也算给新学编程的朋友们一个示范。这个DLL作为共享资源,不含任何标志,欢迎大家使用。笔者希望编程高手们将软件的构思、研制心得、关键算法和核心模块展示出来,为中国的共享软件发展和为编程初学者引引路,这或许是一件大好事情。
一、DLL的功能
一个基于VC-MFC的DLL库 AVIDIB.DLL。内含以下功能函数:
1.位图存取:
A.LPBITMAPINFOHEADER LoadBmp(CString fileName);
//调BMP图形文件:输入文件名,返回图像数据区指针
B.LPBITMAPINFOHEADER LoadTml(CString fileName);
//调自定义压缩图形文件:输入文件名,返回图像数据区指针
C.void SaveBmp(CString fileName,LPBITMAPINFOHEADER bi1);
//存储BMP图形文件,输入:a.文件名b.图像数据区指针
D.void SaveTml(CString fileName, LPBITMAPINFOHEADER bi1,unsigned long mmio,);
//存储自定义压缩位图文件,输入: a.存储文件名b.图像数据区指针c.压缩格式
2.屏幕拷贝
LPBITMAPINFOHEADER CopyScreen();
//屏幕拷贝,返回图像数据区指针
3.将DIB位图序列存为AVI
A.void AviFileOpen(LPCTSTR fileName,int Width,int Height,int ColorBits,int fps,unsigned long mmio);
//建立AVI文件,输入:a.文件名b.图像宽c.图像高d.颜色深度e.回放速度每秒帧数f.压缩格式 (注:压缩格式为mmioFOURCC('t', 's', 'c', 'c')四字节表达式,mmio=0时为选择方式。)
B.BOOL AddFrame(DWORD mFrame,UCHAR *DataBuffer);
//向AVI中加入帧,输入:a序号b图像数据区指针
C.void AviFileClose();
//关闭建立的AVI文件
4.取AVI中的图
A.int AviOpen(CString fileName);
//打开AVI文件,返回AVI中的帧数
B.LPBITMAPINFOHEADER AviRead(int mFrame)
//取AVI文件的M帧,返回图像数据区指针
C.void AviExit(); //关闭取图AVI
二、应用思路
有点编程经历的人已经看出这个DLL库的用途了。它可以做什么?下面笔者提出一些思路供大家参考。
1.可以进行屏幕拷贝,并以BMP位图方式保存,还可以用一些压缩方式保存(800×600的一幅16位色位图,选用适当的压缩格式,可以压缩到只有10多KB),当然从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帧,1分钟才450Kb ,1小时27000Kb。1秒钟就记录一下别人的屏幕情况,还有什么看不到的?)
好,有了项目构思,有了关键模块。你可以试着策划你的项目了,别忘了一点,东西做出来要别人喜欢用,才有效益可言。
三、 用法简介
下面介绍这个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库中的功能函数了。
3.屏幕拷贝:
a.拷贝一屏在当前目录下存为BMP文件
buf =m_avi.CopyScreen(); //拷贝一帧
m_avi.SaveBmp(“test.bmp”, buf); //存为BMP文件
b.拷贝一屏在当前目录下存为压缩图形文件
bi1=m_avi.CopyScreen();
m_avi.SaveTml(“test.tml”, buf); //拷贝一帧
mmioFOURCC('d', 'i', 'v', '3');
//存为mpg4格式压缩文件
注1:在Windows目录下的system.ini文件[drivers32]项中可以看到你的系统已安装的各种视频压缩格式的4字节描述方法。这里选用的压缩格式是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。
c.1秒钟拷贝1屏,连续拷贝20屏,存为mpg4格式的AVI文件
bi1=m_avi.CopyScreen();//先拷贝1帧,取得当前屏幕的数据
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
4.调入文件显示:
a.调入压缩图形并显示
buf =m_avi.LoadTml(“test.tml”);//在当前目录调入压缩文件,
//返回图形指针
xianshi(); //调入自己定义显示
b.调入AVI文件并显示
int len0=m_avi.AviOpen(“test.avi”);//在当前目录打开AVI
//文件,返回帧数
for(int i=0;i
xianshi(); //显示
}
m_avi.AviExit();//完毕,关闭
注3:无论压缩与否的图形和取出的AVI图形,返回的图形数据是解压的与设备无关的DIB图形格式,你也可以用其他的方式在窗口上显示这些图形。
四、获取本文的相关资料
本文的3个文件:avidib.dll、avidib.lib、avifile.h放在电脑报函授学校网站上。欢迎大家下载使用。
网址:http://www.pcwclub.com/school
无条件上网的读者可以汇款20元到电脑报函授学校邮购(磁盘)。在磁盘上还有本文的详细示范和演示文档。
收款人:重庆渝中区双钢路3号电脑报函授学校
邮编:400013
电话:023-63658798 63658811
E-mail:tml@cpcw.com