VFP照像程序说明

硬件准备

  1. 能运行Windows 98或更高的计算机。
  2. USB接口摄像头一只。

  将USB摄像头接入电脑,安装好驱动程序和应用软件,打开应用软件,在Video Format设置中将其Image Size(图像尺寸)设为CIF352×288)。

  软件准备

  1. Visual Foxpro6.0以上版本,以下简称VFP)。
  2. AvCap.ocx控件

  AvCap是一个基于DirectShow过滤器的音/视频捕捉和预览的ActiveX控件。在应用程序或页面中放一个AvCap,只需很少的代码就可让您的软件支持音/视频捕捉了。

  3. PicClp32.ocx控件(类名PictureClip)。

  本控件位于WindowsSystemSystem32文件夹内,在安装VFP时被自动安装。

  由于使用AvCap控件所捕捉的图像尺寸与实际应用时的图像尺寸不太一致,因此需用PictureClip控件将其剪裁为指定尺寸。用它的Picture属性将源位图加载到控件中,再用ClipXClipY属性指定剪裁区域的左上角。用 ClipHeightClipWidth属性指定剪裁区域的范围。然后利用VFPSavePicture函数将其写入到指定的位图文件中。

  编程

  1. 准备工作
  (1)为便于管理,在某驱动器(如D盘)的根目录下建一子目录Photo,将下载的AcCap.ocx控件拷入该目录,用“画笔”程序画一图像,高×宽=288×216(如图1),命名为Default.bmp,将其保存入Photo目录。在本目录下再建一子目录Bmp,用于存放拍照的照片。

1 默认图片
  (2)建一数据库表Student.dbf,将其存入Photo目录,表结构如图2

2 数据表

  在图2所示表中,索引类型设为“候选索引”的目的是保证学生在数据库表中的惟一性。在电子照相时,以学号作为该学生的照片文件名,可避免重复。xh(学号)字段的8位可按如下格式输入,如20040001,其中前四位代表入学年级,后四位代表学生序列,学号范围从2004000120049999
  (3)注册控件:可在命令行方式下注册两个控件,如:regsvr32 AvCap.ocxregsvr32 PicClp32.ocx,也可在VFP环境中,通过菜单“工具→选项→控件→ActiveX控件”方式来注册。

  2. 制作表单

  (1)运行VFP,建立如图3所示的表单集Formset1,添加两个表单Form1Form2。设置Form1Caption属性为预览窗口,在其内添加AvCap控件,控件的Name属性设为OleAvCap;设置Form2Caption属性为照相窗口,在其内添加如图3所示的6个控件(图像剪裁控件PictureClip、图像控件Image、列表框控件List、命令按钮控件CommandButton三个),控件的Name属性分别设为OlePicClip Image1List1CmdPhotoCmdNextCmdQuit

3 制作表单
  (2)将数据库表Student.dbf添加到该表单集的数据环境中去,将CurSor1Order属性设为xh

  (3)编写程序代码:

  在Formset1Init Event(即Formset1.Init)中添加以下代码:

  
IF thisformset.form1.oleAvCap.CurVcd=0
  
thisformset.form1.oleAvCap.PlayState
  
=1
  
ELSE
   =Messagebox("视频设备连接不上! "+chr(13)+"请检查电源线或数据线!", 0+16,"错误信息!
")
  
RETU .F.
  
ENDIF
  
thisformset.form2.CmdPhoto.setfocus
  在Form1Init Event(即Form1.Init)中添加以下代码:

  
this.Left=3
  
this.Top=1
  this.Width=216 &&&&&&与下面要拍照的照片宽度一致

  
this.Height=312
  
this.MaxButton=.F.
  
this.MinButton=.F.
  
this.ControlBox=.F.
  
this.BorderStyle=1
  this.Caption="预览窗口
"
  *****以下设置AvCap控件的大小及位置

  
this.OleAvCap.Top=12
  
this.OleAvCap.Width=352
  
this.OleAvCap.Height=288
  
this.OleAvCap.Left=-(352-216)/2
  &&&&&&将本控件居中,保证视频流中人像居中

  在Form2Init Event(即Form2.Init)中添加以下代码:

  
this.Left=228
  
this.Top=1
  
this.Width=394
  
this.Height=394
  
this.MaxButton=.F.
  
this.MinButton=.F.
  
this.ControlBox=.F.
  
this.BorderStyle=1
  this.Caption="照相窗口
"
  *****以下设置image控件的大小、位置等属性

  
this.image1.Left=10
  
this.image1.Top=12
  
this.image1.Width=216
  
this.image1.Height=288
  
this.image1.BorderStyle=1
  
IF file('bmp/'+xh+'.bmp')
  
this.image1.picture='bmp/'+xh+'.bmp'
  
ELSE
  
this.image1.picture='default.bmp'
  
ENDIF
  *****以下设置List控件的大小、位置等属性

  
this.List1.ColumnCount=2
  
this.List1.Left=236
  
this.List1.Top=12
  
this.List1.Width=148
  
this.List1.Height=288
  
this.List1.FontSize=12
  
this.List1.RowSourceType=0
  
this.List1.RowSource="student.xh,xm"
  
this.List1.RowSourceType=6
  
this.List1.ListItemId=1
  在List1InteractiveChange Event中添加以下代码:

  *****以下代码保证记录变动后,学生照片跟着刷新

  
IF file('bmp/'+xh+'.bmp')
  
thisform.image1.picture='bmp/'+xh+'.bmp'
  
ELSE
  
thisform.image1.picture='default.bmp'
  
ENDIF
  
thisform.CmdPhoto.setfocus
  在CmdPhotoClick EventCmdPhoto.Click)中添加以下代码:

  
IF file('bmp/'+xh+'.bmp')
  
?chr(7)
   nChoice=Messagebox("照片已存在!"+chr(13)+chr(13)+"替换吗?", 4+32+256,"提示信息!
")
   IF nChoice=6 &&&&&&&&&&&&&&&&&&选择
YES
   ****以下代码先抓取当前视频流中的一幅图像将其保存为大照片
****
  
thisformset.form1.OleAvCap.TakePictureToFile('bmp/'+xh+'.bmp')
   ****以下代码通过PicClip32.ocx控件将大照片剪裁为小照片
*******
  
thisform.OlePicClip.picture=loadpicture('bmp/'+xh+'.bmp')
  
thisform.OlePicClip.clipx=(352-216)/2+1
  
thisform.OlePicClip.clipy=0
  
thisform.OlePicClip.clipheight=288
  
thisform.OlePicClip.clipwidth=216
  
SavePicture(thisform.OlePicClip.clip,'bmp/'+xh+'.bmp')
  
ENDIF
  
ELSE
  
thisformset.form1.OleAvCap.TakePictureToFile('bmp/'+xh+'.bmp')
  
thisform.OlePicClip.picture=loadpicture('bmp/'+xh+'.bmp')
  
thisform.OlePicClip.clipx=(352-216)/2+1
  
thisform.OlePicClip.clipy=0
  
thisform.OlePicClip.clipheight=288
  
thisform.OlePicClip.clipwidth=216
  
SavePicture(thisform.OlePicClip.clip,'bmp/'+xh+'.bmp')
  
ENDIF
  thisform.List1.InteractiveChange &&&&刷新照片

  this.parent.CmdNext.setfocus &&&&CmdNext按钮转换焦点实现轻松拍照

  在CmdNextClick EventCmdNext.Click)中添加以下代码:

  
thisform.List1.ListItemId=thisform.List1.ListItemId+1
  thisform.List1.InteractiveChange &&&&刷新照片

  this.parent.CmdPhoto.setfocus &&&&Cmdphoto按钮转换焦点实现轻松拍照

  在CmdQuitClick Event
CmdQuit.
  Click)中添加以下代码:

  
thisformset.release
  至此,程序编写完毕,按按钮运行程序就可进行电子照相了。照相过程非常方便,只需按回车键或空格键就可轻松采集照片。要保证照片质量,USB摄像头最好固定,并且保证光线明亮、均匀、自然、柔和。

相关内容推荐