flex+FluorineFx ASP.NET 视频拍照
声明:此代码为网上代码修改而来,为与FluorineFX配合做了相应修改([Flex视频截图并通过WebService(C#)保存])
Flex代码:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="100%" height="100%" creationComplete="initApp()" horizontalAlign="center" verticalAlign="middle" fontFamily="Courier New" fontSize="12">
<mx:Style>
Alert{font-size:12px;}
</mx:Style>
<mx:Script>
<![CDATA[
import mx.graphics.codec.JPEGEncoder;
import flash.net.NetConnection;
import flash.net.ObjectEncoding;
import flash.net.Responder;
import mx.events.CloseEvent;
import mx.controls.Alert;
//
private var nc:NetConnection;
private var rp:Responder;
private var DEFAULT_CAMERA_WIDTH:Number = 230; //摄像头显示宽度
private var DEFAULT_CAMERA_HEIGHT:Number = 167; //摄像头显示高度
private var m_camera:Camera; //定义一个摄像头
private var m_localVideo:Video; //定义一个本地视频
private var m_pictureBitmapData:BitmapData //定义视频截图
private var m_picUrl:String;//保存的图片名称
private var fileRef:FileReference;
private var urlReq:URLRequest;
private function initApp():void
{
m_picUrl="";
t_btn_Shooting.enabled = false;
t_ban_Save.enabled = false;
initCamera();
}
//初始化摄像头
private function initCamera():void
{
m_camera = Camera.getCamera();
if(m_camera != null)
{
DEFAULT_CAMERA_WIDTH = t_vd_Video.width;//m_camera.width;
DEFAULT_CAMERA_HEIGHT=t_vd_Video.height;//m_camera.height;
m_camera.addEventListener(StatusEvent.STATUS,onCameraStatusHandler);
m_camera.setMode(DEFAULT_CAMERA_WIDTH,DEFAULT_CAMERA_HEIGHT,30);
m_localVideo = new Video();
m_localVideo.width = DEFAULT_CAMERA_WIDTH;
m_localVideo.height = DEFAULT_CAMERA_HEIGHT;
m_localVideo.attachCamera(m_camera);
t_vd_Video.addChild(m_localVideo);
}
else
{
Alert.show("没有找到摄像头,是否重新查找。","提示:",Alert.OK|Alert.NO,this,InitCamera);
return;
}
}
//拍照按钮事件,进行视频截图
private function SnapshotPicture():void
{
m_pictureBitmapData = new BitmapData(DEFAULT_CAMERA_WIDTH,DEFAULT_CAMERA_HEIGHT);
m_pictureBitmapData.draw(t_vd_Video,new Matrix());
var m_pictureBitmap:Bitmap = new Bitmap(m_pictureBitmapData);
t_img_Picture.addChild(m_pictureBitmap);
t_panel_Picture.visible = true;
t_ban_Save.enabled = true;
//将bitmap转存到byteArray
//编码成图片格式流
//var pixels:ByteArray = m_pictureBitmapData.getPixels( new Rectangle(0,0,DEFAULT_CAMERA_WIDTH,DEFAULT_CAMERA_HEIGHT) );
//上面一行的方法行不通,需要使用以下两行的方法
var encoder:JPEGEncoder = new JPEGEncoder(100);
var pixels:ByteArray = encoder.encode(m_pictureBitmapData);
nc=new NetConnection();
//以处理来自服务器的返回值
rp=new Responder(successResult,errStatus);
//指示应对其调用回调方法的对象
nc.client=nc;
//设置采用的编码
nc.objectEncoding = flash.net.ObjectEncoding.AMF3;
nc.connect("http://172.168.0.99/Flfx/Gateway.aspx");
nc.call("Flfx.Sample.getPic",rp,pixels,"test.jpg");
}
private function successResult(result:String):void {
trace("返回结果:"+result);
m_picUrl=result;
trace(m_picUrl);
//关闭连接
nc.close();
}
private function errStatus(result:Boolean):void {
trace("发生错误!");
Alert.show("不好意思,发生错误!*_!");
nc.close();
}
//保存按钮事件,下载视频截图
private function SavePicture():void
{
if(m_picUrl != "" && m_picUrl != "null" )
{
//Alert.show("http://172.168.0.99/flfx/"+m_picUrl);
urlReq = new URLRequest("http://172.168.0.99/flfx/"+m_picUrl);
fileRef = new FileReference();
fileRef.download(urlReq);
}
}
//检测摄像头权限事件
private function onCameraStatusHandler(event:StatusEvent):void
{
if(!m_camera.muted)
{
t_btn_Shooting.enabled = true;
}
else
{
Alert.show("无法链接到活动摄像头,是否重新检测。","提示:",Alert.OK|Alert.NO,this,InitCamera);
}
m_camera.removeEventListener(StatusEvent.STATUS,onCameraStatusHandler);
}
//当摄像头不存在,或连接不正常时重新获取
private function InitCamera(event:CloseEvent):void
{
if(event.detail == Alert.OK)
{
initApp();
}
}
]]>
</mx:Script>
<mx:Panel x="10" y="10" width="250" height="251" layout="absolute" title="视频拍照" horizontalAlign="center" verticalAlign="middle">
<mx:VideoDisplay id="t_vd_Video" width="230" height="167" backgroundColor="#9DC6A7"/>
<mx:ControlBar >
<mx:Button id="t_btn_Shooting" label="拍照" click="SnapshotPicture()"/>
</mx:ControlBar>
</mx:Panel>
<mx:Panel id="t_panel_Picture" x="268" y="10" width="250" height="251" layout="absolute" title="拍照图片" visible="false">
<mx:Image id="t_img_Picture" x="0" y="0" width="230" height="167"/>
<mx:ControlBar>
<mx:Button id="t_ban_Save" label="保存" click="SavePicture()" />
</mx:ControlBar>
</mx:Panel>
</mx:Application>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="100%" height="100%" creationComplete="initApp()" horizontalAlign="center" verticalAlign="middle" fontFamily="Courier New" fontSize="12">
<mx:Style>
Alert{font-size:12px;}
</mx:Style>
<mx:Script>
<![CDATA[
import mx.graphics.codec.JPEGEncoder;
import flash.net.NetConnection;
import flash.net.ObjectEncoding;
import flash.net.Responder;
import mx.events.CloseEvent;
import mx.controls.Alert;
//
private var nc:NetConnection;
private var rp:Responder;
private var DEFAULT_CAMERA_WIDTH:Number = 230; //摄像头显示宽度
private var DEFAULT_CAMERA_HEIGHT:Number = 167; //摄像头显示高度
private var m_camera:Camera; //定义一个摄像头
private var m_localVideo:Video; //定义一个本地视频
private var m_pictureBitmapData:BitmapData //定义视频截图
private var m_picUrl:String;//保存的图片名称
private var fileRef:FileReference;
private var urlReq:URLRequest;
private function initApp():void
{
m_picUrl="";
t_btn_Shooting.enabled = false;
t_ban_Save.enabled = false;
initCamera();
}
//初始化摄像头
private function initCamera():void
{
m_camera = Camera.getCamera();
if(m_camera != null)
{
DEFAULT_CAMERA_WIDTH = t_vd_Video.width;//m_camera.width;
DEFAULT_CAMERA_HEIGHT=t_vd_Video.height;//m_camera.height;
m_camera.addEventListener(StatusEvent.STATUS,onCameraStatusHandler);
m_camera.setMode(DEFAULT_CAMERA_WIDTH,DEFAULT_CAMERA_HEIGHT,30);
m_localVideo = new Video();
m_localVideo.width = DEFAULT_CAMERA_WIDTH;
m_localVideo.height = DEFAULT_CAMERA_HEIGHT;
m_localVideo.attachCamera(m_camera);
t_vd_Video.addChild(m_localVideo);
}
else
{
Alert.show("没有找到摄像头,是否重新查找。","提示:",Alert.OK|Alert.NO,this,InitCamera);
return;
}
}
//拍照按钮事件,进行视频截图
private function SnapshotPicture():void
{
m_pictureBitmapData = new BitmapData(DEFAULT_CAMERA_WIDTH,DEFAULT_CAMERA_HEIGHT);
m_pictureBitmapData.draw(t_vd_Video,new Matrix());
var m_pictureBitmap:Bitmap = new Bitmap(m_pictureBitmapData);
t_img_Picture.addChild(m_pictureBitmap);
t_panel_Picture.visible = true;
t_ban_Save.enabled = true;
//将bitmap转存到byteArray
//编码成图片格式流
//var pixels:ByteArray = m_pictureBitmapData.getPixels( new Rectangle(0,0,DEFAULT_CAMERA_WIDTH,DEFAULT_CAMERA_HEIGHT) );
//上面一行的方法行不通,需要使用以下两行的方法
var encoder:JPEGEncoder = new JPEGEncoder(100);
var pixels:ByteArray = encoder.encode(m_pictureBitmapData);
nc=new NetConnection();
//以处理来自服务器的返回值
rp=new Responder(successResult,errStatus);
//指示应对其调用回调方法的对象
nc.client=nc;
//设置采用的编码
nc.objectEncoding = flash.net.ObjectEncoding.AMF3;
nc.connect("http://172.168.0.99/Flfx/Gateway.aspx");
nc.call("Flfx.Sample.getPic",rp,pixels,"test.jpg");
}
private function successResult(result:String):void {
trace("返回结果:"+result);
m_picUrl=result;
trace(m_picUrl);
//关闭连接
nc.close();
}
private function errStatus(result:Boolean):void {
trace("发生错误!");
Alert.show("不好意思,发生错误!*_!");
nc.close();
}
//保存按钮事件,下载视频截图
private function SavePicture():void
{
if(m_picUrl != "" && m_picUrl != "null" )
{
//Alert.show("http://172.168.0.99/flfx/"+m_picUrl);
urlReq = new URLRequest("http://172.168.0.99/flfx/"+m_picUrl);
fileRef = new FileReference();
fileRef.download(urlReq);
}
}
//检测摄像头权限事件
private function onCameraStatusHandler(event:StatusEvent):void
{
if(!m_camera.muted)
{
t_btn_Shooting.enabled = true;
}
else
{
Alert.show("无法链接到活动摄像头,是否重新检测。","提示:",Alert.OK|Alert.NO,this,InitCamera);
}
m_camera.removeEventListener(StatusEvent.STATUS,onCameraStatusHandler);
}
//当摄像头不存在,或连接不正常时重新获取
private function InitCamera(event:CloseEvent):void
{
if(event.detail == Alert.OK)
{
initApp();
}
}
]]>
</mx:Script>
<mx:Panel x="10" y="10" width="250" height="251" layout="absolute" title="视频拍照" horizontalAlign="center" verticalAlign="middle">
<mx:VideoDisplay id="t_vd_Video" width="230" height="167" backgroundColor="#9DC6A7"/>
<mx:ControlBar >
<mx:Button id="t_btn_Shooting" label="拍照" click="SnapshotPicture()"/>
</mx:ControlBar>
</mx:Panel>
<mx:Panel id="t_panel_Picture" x="268" y="10" width="250" height="251" layout="absolute" title="拍照图片" visible="false">
<mx:Image id="t_img_Picture" x="0" y="0" width="230" height="167"/>
<mx:ControlBar>
<mx:Button id="t_ban_Save" label="保存" click="SavePicture()" />
</mx:ControlBar>
</mx:Panel>
</mx:Application>
ASP.NET代码[FluorineFx web项目 Sample.cs类]:
using System;
using FluorineFx;
using FluorineFx.AMF3;
using System.IO;
using System.Net;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Web;
namespace Flfx
{
/// <summary>
/// Fluorine sample service.
/// </summary>
[RemotingService("Fluorine sample service")]
public class Sample
{
public Sample()
{
}
public string Echo(string text)
{
return "Gateway echo: " + text;
}
//生成图片
public string getPic(ByteArray byteArray,string fileName)
{
uint length = byteArray.Length;
byte[] bytes = new byte[length];
byteArray.ReadBytes(bytes, 0, length);
Stream ms = new MemoryStream(bytes);
Image img = Bitmap.FromStream(ms);
Bitmap bmp = new Bitmap(img);
ms.Position=0;
//Bitmap bmp = (Bitmap)Bitmap.FromStream(ms);
//To save the image to a file
MemoryStream tempStream = new MemoryStream();
bmp.Save(tempStream,System.Drawing.Imaging.ImageFormat.Jpeg);
//文件名
DateTime date = DateTime.Now;
fileName=date.Year.ToString() + date.Month.ToString() + date.Day.ToString() + date.Hour.ToString() + date.Minute.ToString() + date.Second.ToString() + Convert.ToString((new Random()).Next(99) * 97 + 100);
fileName+=".jpg";
FileStream fs = new FileStream(System.Web.HttpContext.Current.Server.MapPath(fileName), FileMode.Create);
tempStream.WriteTo(fs);
tempStream.Close();
fs.Close();
return fileName;
}
}
}
using FluorineFx;
using FluorineFx.AMF3;
using System.IO;
using System.Net;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Web;
namespace Flfx
{
/// <summary>
/// Fluorine sample service.
/// </summary>
[RemotingService("Fluorine sample service")]
public class Sample
{
public Sample()
{
}
public string Echo(string text)
{
return "Gateway echo: " + text;
}
//生成图片
public string getPic(ByteArray byteArray,string fileName)
{
uint length = byteArray.Length;
byte[] bytes = new byte[length];
byteArray.ReadBytes(bytes, 0, length);
Stream ms = new MemoryStream(bytes);
Image img = Bitmap.FromStream(ms);
Bitmap bmp = new Bitmap(img);
ms.Position=0;
//Bitmap bmp = (Bitmap)Bitmap.FromStream(ms);
//To save the image to a file
MemoryStream tempStream = new MemoryStream();
bmp.Save(tempStream,System.Drawing.Imaging.ImageFormat.Jpeg);
//文件名
DateTime date = DateTime.Now;
fileName=date.Year.ToString() + date.Month.ToString() + date.Day.ToString() + date.Hour.ToString() + date.Minute.ToString() + date.Second.ToString() + Convert.ToString((new Random()).Next(99) * 97 + 100);
fileName+=".jpg";
FileStream fs = new FileStream(System.Web.HttpContext.Current.Server.MapPath(fileName), FileMode.Create);
tempStream.WriteTo(fs);
tempStream.Close();
fs.Close();
return fileName;
}
}
}
效果图:
摄像头是"9158虚拟摄像头",放了张图片;D