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摄像头最好固定,并且保证光线明亮、均匀、自然、柔和。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vfp9.0调用API制作照相软件实例 PUBLIC WM_CAP_DRIVER_DISCONNECT PUBLIC hwndc,WM_CAP_SAVEDIB,WM_CAP_FILE_SET_CAPTURE_FILEA,WM_CAP_SEQUENCE,WM_CAP_STOP DECLARE INTEGER capCreateCaptureWindowA IN "AVICAP32.DLL" STRING lpszWindowName ,INTEGER dwStyle , INTEGER x, INTEGER Y, INTEGER nWidth ,INTEGER nHeight,INTEGER ParentWin,INTEGER nId DECLARE INTEGER SendMessage IN "user32" INTEGER HWND, INTEGER wmsg,INTEGER wpar1, INTEGER wpar2 DECLARE INTEGER SendMessage IN "user32" AS SendMessageA INTEGER HWND, INTEGER wmsg,INTEGER wpar1, STRING wpar2 *!* 显示: WM_USER = 1024 WM_CAP_START = WM_USER WM_CAP_STOP = WM_CAP_START + 68 WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10 WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11 WM_CAP_SAVEDIB = WM_CAP_START + 25 WM_CAP_GRAB_FRAME = WM_CAP_START + 60 WM_CAP_SEQUENCE = WM_CAP_START + 62 WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20 WM_CAP_SEQUENCE_NOFILE =WM_CAP_START+ 63 WM_CAP_SET_OVERLAY =WM_CAP_START+ 51 WM_CAP_SET_PREVIEW =WM_CAP_START+ 50 WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START +6 WM_CAP_SET_CALLBACK_ERROR=WM_CAP_START +2 WM_CAP_SET_CALLBACK_STATUSA= WM_CAP_START +3 WM_CAP_SET_CALLBACK_FRAME= WM_CAP_START +5 WM_CAP_SET_SCALE=WM_CAP_START+ 53 WM_CAP_SET_PREVIEWRATE=WM_CAP_START+ 52 hWndC = capCreateCaptureWindowA('My Own Capture Window',1342177280,0,0,200,150,THISFORM.HWND ,0) &&显示大小 IF hWndC 0 SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0) SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0) SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0) SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0) SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0) SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0) SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0) SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0) * THISFORM.ACTIVATE ENDIF
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值