flex+FluorineFx ASP.NET 视频拍照

来源:互联网 发布:js数组删除元素 编辑:程序博客网 时间:2024/05/18 14:22

声明:此代码为网上代码修改而来,为与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>


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;
        }  
    }
}

效果图:

摄像头是"9158虚拟摄像头",放了张图片;D
原创粉丝点击