在软件中,拍照功能,容易实现,但是,在网页上,实现这一功能,却让很多软件工程师感到很棘手。本文探讨了在网页上实现在线远程拍照并上传到数据通信库服务器的一种思路及其实现方法。
1 引言
在软件中,拍照功能,容易实现,但是,在网页上,实现这一功能,却让很多软件工程师感到很棘手。本文探讨了在网页上实现在线远程拍照并上传到数据库服务器的一种思路及其实现方法。
2基本思路
使用flash设计视频界面并嵌套在asp.net页面上,通过flash与页面的交互,使用C#语言,实现在线远程拍照并保存照片同时上传到数据库服务器。
3设计实现
3.1设置摄像头
在flash中设置摄像头,须用到以下两个方法:
(1)Camera.get([index]):检测摄像头,为捕获视频返回对Camera对象的引用
var cam:Camera = Camera.get();
if ( cam == null)
{
//摄像头检测出错处理
}
以上语句检测系统默认的摄像头(Camera)对象,并分配给变量cam,如果系统已接有多个摄像头,则可以使用参数index引用指定的摄像头。
如果Camera.get返回null,则表明所引用的摄像头正在被其他程序使用,或者系统没安装摄像头。
要确定是否安装了摄像头,则可使用Camera.name.length。
(2)Video.attachVideo(source):将Camera对象source附加到Video对象,开始捕获视频。
cam.setMode(320, 240, 10, true);
my_Video.my_video.attachVideo(cam);
以上语句设置摄像头的捕获模式,并将摄像头变量cam附加到视频窗口中的Video对象my_video,开始捕获视频。
2.2拍照:
(1)定义用于存储照片信息的对象:
var lv:LoadVars;
lv = new LoadVars();
LoadVars对象可通过其sendAndLoad方法将对象中的属性变量发送(send)到指定的 URL,同时载入(load)服务端器的输出变量并将其放入目标对象中。载入变量时,可通过LoadVars对象的 onLoad事件来判断载入的结果是成功还是失败。
(2)拍照:
1)从视频窗口中的视频流提取图像:
创建指定宽度和高度的BitmapData对象:
lv.bm = new flash.display.BitmapData(210, 150,true,16);
使用类flash.geom.Matrix,设置图像缩放比例,调整图像大小:
var myMatrix:Matrix = new Matrix();
myMatrix.scale(1.3,1.3);
按照视频窗口中的视频流绘制BitmapData位图图像:
lv.bm.draw(my_Video,myMatrix);
2)图片预览:将位图图像附加到影片剪辑预览窗口,建立从影片剪辑到位图对象的引用:
my_Pre.attachBitmap(lv.bm, 1, “always”, true);
lv.PWidth=210;
lv.PHeight=150;
X=0;
Y=0;
3)序列化图像,将BitmapData对象的 RGB 像素值存放在lv对象的strBMP变量中:
lv.strBMP=””;
for(Y=0;Y<150;Y++)
{
for(X=0;X<210;X++)
{
lv.strBMP += lv.bm.getPixel(X,Y).toString(16)+”,”;
}
}
3.3上传图片
在flash中捕获的图像须指定为谁的照片,但在页面中指定比在flash中指定更方便,在连接数据库方面也更方便,因此下面将图像传至服务器页面,由服务器页面进行处理。
(1)在服务器中,设置将拍照的图片上传到哪个网址,使用xml文件:
页面路径及页面名
(2)在flash中加载xml文件,并读取页面路径及页面名:
var url = “”;
var myXML = new XML();
myXML.load(“xml文件路径及文件名”);
myXML.ignoreWhite = true;
myXML.onLoad = function(success)
{
if (success)
{
url=myXML.childNodes[0].childNodes[0].childNodes[0].nodeValue;
}
}
加载成功,则success为真值,读取的页面路径及页面名存放在url中。
(3)上传照片,并返回结果:
1)定义用于存储页面回传信息的变量:
var lv_Ret:LoadVars;
lv_Ret = new LoadVars();
2)将lv对象上传,因lv对象中存储有照片位图的序列化信息,因此,照片的序列化像素信息即随着lv上传至指定的页面,并返回上传结果:
lv.sendAndLoad(url,lv_Ret,”POST”);
lv_Ret.onLoad = function(re:Boolean)
{
txt_Msg.text = “”;
if(re)
{//上传成功,接收上传页面回发的信息
txt_Msg.text = lv_Ret.RetMsg;
}else
{//上传失败,原因:没有找到目标地址或超时等
txt_Msg.text = lv_Ret.RetMsg;
}
}
将返回结果显示在flash文本标签txt_Msg中。
3.4服务器页面接收设置:
(1)接收并处理照片信息:
Response.ContentType = "text/plain";
if(Request.Form["PHeight"]!=null&&Request.Form["PWidth"]!=null&&Request.Form["strBMP"]!=null)
{
//PHeight:照片高度
int height = int.Parse(Request.Form["PHeight"].ToString());
//PWidth:照片宽度
int width = int.Parse(Request.Form["PWidth"].ToString());
//strBMP:照片位图序列化像素信息
string strBmp = Request.Form["strBMP"].ToString();
//自定义函数,实现照片序列化像素信息转化、存储照片并保存至数据库
SaveBmp(BuildBitmap(width, height, strBmp), "Student");
}
(2)向flash传送处理结果:
Response.Write("RetMsg=接收处理结果");
4总结
本系统基于asp.net技术,而asp.net基于服务器处理模式,采用flash设计视频功能并嵌套在网页上,避免了客户端视频设计的困难,同时通过flash与asp.net页面的交互技术,实现了flash视频图片轻松传送至服务器进行处理,达到系统设计的目的要求。
作者:林贞文 来源:计算机光盘软件与应用 2013年6期