silverlight4:摄像头占用状态检测以及二种截屏方法

状态检测主要包括二个方面:是否安装了摄像头,摄像头是否被其它程序占用

视频截图有二种方法:一是直接利用CaptureSource类的CaptureImageAsync异步截屏,另一种是直接利用WriteableBitmap截屏幕,二种截屏方法的区别在于,CaptureImageAsync始终截的是视频原始内容,而直接用WriteableBitmap对指定区域截屏时,如果视频上面还有其它控件(比如TextBlock),最终截下的图会有其它内容叠在上面(如下图)
 

Xaml部分代码:

<UserControl x:Class="CameraCheck.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    >
    <Grid x:Name="LayoutRoot" Background="White">
        <Grid.RowDefinitions>
            <RowDefinition Height="162"></RowDefinition>
            <RowDefinition Height="190"></RowDefinition>
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="0">
            <Canvas Height="120" Width="160" HorizontalAlignment="Center" x:Name="cVideo" Margin="0,10,0,10">
                <Rectangle Width="160" Height="120" x:Name="rectVideo" StrokeThickness="1" Stroke="Black"></Rectangle>
                <TextBlock x:Name="lblStatus" Text="菩提树下的杨过"  Foreground="White" Canvas.Top="50" Width="160" TextAlignment="Center"></TextBlock>
            </Canvas>
            <StackPanel  Orientation="Horizontal" HorizontalAlignment="Center">
                <Button Width="80" Height="22" Content="检测摄像头" x:Name="btnCheck" Click="btnCheck_Click"></Button>
                <Button Width="80" Height="22" Content="视频原始截图" x:Name="btnCapture1" Margin="5,0,0,0" Click="btnCapture1_Click"></Button>
                <Button Width="80" Height="22" Content="bitmap截图" x:Name="btnCapture2" Margin="5,0,0,0" Click="btnCapture2_Click"></Button>
            </StackPanel>
        </StackPanel>

        <ScrollViewer x:Name="imgList" Height="180" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Hidden" Margin="0,10,0,0" Grid.Row="1">
            <StackPanel x:Name="sp" Orientation="Horizontal"></StackPanel>
        </ScrollViewer>
    </Grid>
</UserControl>

后端CS代码:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace CameraCheck
{
    public partial class MainPage : UserControl
    {
        bool _isWorked = false;
        CaptureSource _webCamSource;

        public MainPage()
        {
            InitializeComponent();
        }

        private void btnCheck_Click(object sender, RoutedEventArgs e)
        {
            if (_isWorked) { return; }

            VideoCaptureDevice webCam = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice();

            if (webCam == null)
            {
                lblStatus.Text = "未检测到摄像头设备!";
                return;
            }

            if (CaptureDeviceConfiguration.RequestDeviceAccess())
            {
                _webCamSource = new CaptureSource();
                _webCamSource.VideoCaptureDevice = webCam;
                VideoBrush video = new VideoBrush();
                video.SetSource(_webCamSource);
                video.Stretch = Stretch.UniformToFill;
                try
                {
                    _webCamSource.Start();
                    this.rectVideo.Fill = video;
                    lblStatus.Text = "摄像头正在工作中...";//测试用
                    _isWorked = true;
                    _webCamSource.CaptureFailed += webCamSource_CaptureFailed;
                    _webCamSource.CaptureImageCompleted += webCamSource_CaptureImageCompleted;
                }
                catch
                {
                    lblStatus.Text = "摄像头无法使用(可能被占用)";
                }
            }
            else
            {
                lblStatus.Text = "您不同意在本程序\n中使用摄像头设备.";
            }
        }

        /// <summary>
        /// CaptureImageAsync视频原始内容截图
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCapture1_Click(object sender, RoutedEventArgs e)
        {
            if (_isWorked)
            {
                _webCamSource.CaptureImageAsync();
            }
        }

        void webCamSource_CaptureImageCompleted(object sender, CaptureImageCompletedEventArgs e)
        {
            WriteableBitmap wb = e.Result;
            Image image = new Image();
            image.Height = 120;
            image.Margin = new Thickness(5);
            image.Source = wb;
            sp.Children.Add(image);
        }

        void webCamSource_CaptureFailed(object sender, ExceptionRoutedEventArgs e)
        {
            lblStatus.Text = "截屏失败!";
        }

        /// <summary>
        /// 利用WriteableBitmap截屏
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCapture2_Click(object sender, RoutedEventArgs e)
        {
            WriteableBitmap wb = new WriteableBitmap(cVideo, null);
            Image image = new Image();
            image.Height = 120;
            image.Margin = new Thickness(5);
            image.Source = wb;
            sp.Children.Add(image);
        }

    }
}

另外silverlight 4中使用摄像头时,提示用户是否同意使用摄像头的界面中多出了一个"记住我"的选项

这个功能本来是想方便用户,不必每次都提示用户选择,但是也有一个副作用:比如第一次选择时,如果您不小心勾中了"Remember my answer"并选择了"No",那么以后系统会直接拒绝使用摄像头设备,而且没有任何提示!

当然也可以右击,在silverlight选项里去掉这种错误的记忆(如下图)

但问题是:用户很有可能不知道从哪里进入这个界面,所以我个人觉得如果当silverlight了自动记住了"禁止使用摄像头"时,是否能给个提示?这样会显得更友好一些

 

最后,从技术上讲silverlight 4的摄像头还有一个功能不如flash做得贴心,flash中摄像头有activity事件可以用来监听摄像头是否有活动,而silverlight中没有。这在某些领域中很有用,比如监控系统中经常需要判断摄像头对着的是不是一个静止不动的物体。(当然sl中变相的办法可以通过不断截屏然后比较二张图的差异,但这毕竟太麻烦了,不知道正式版中是不是会有所改进)

时间: 2024-10-31 11:21:09

silverlight4:摄像头占用状态检测以及二种截屏方法的相关文章

三星S6怎么截屏 三星S6两种截屏方法

方法一,Android系统自带截屏方式 同时按住手机的[电源键]+[HOME键]两秒,就可以完成截屏了.(如下图) 方法二,掌擦截图 点击[应用程序]-[设定]-[我的设备]-[动作与手势]-[手掌动作]开户它[手掌动作]-[截取屏幕]选项开启. 设置后,当您想截图时,直接用手的侧面从右至左(从左至右)划过屏幕即可截图. 上面两种截图文件全部都保存在三星S6手机的 "应用程序"-我的文件-所有文件-Device storage-Pictures-Screenshots目录中了. 总结,

索尼z5手机3种截屏方法总结

索尼z5有三种截图方式: 第一种:安卓系统肯定少不了原生截图方式了,只要在截屏界面我们同时按下"电源键+音量键下键"即可了,这是一种截图方式. 按住后2到3秒后就可以完成截图了. 第二种:使用屏幕左下角的紫色截图图标,只要点击它即可截图了. 这种截图有一个好处就是可以选择截图的区域并且进行编辑. 第三种:长按关机电源键将会出现截图与记录屏幕2个截屏选项,截图点完后与第一种方法的截屏相同. 手机中查看截图可以用相册或者在"内部储存设备"-选择"Picture

三星G1600(6.0.1)3种截屏方法介绍

方法一.快捷键截屏  在您想要截取屏幕的界面,同时按住主屏幕键和电源键,当屏幕上方出现"已捕捉屏幕截图"图标时代表截屏成功.        截图保存路径:[实用工具]-[我的文件]-[设备存储]-[DCIM]-[Screenshots]文件夹中.    方法二:快捷图标截屏   1.在想要截取屏幕图像的页面,下拉屏幕顶帘菜单.        2.向下滑动[=]图标.        3.点击[截取屏幕]快捷图标即可截屏.       方法三.助理菜单截屏  1.在待机页面下,点击[设置]

红米4手机常用的3种截屏方法

①红米4截图方法一:组合按键 红米4可以直接使用 『Home键』+『音量-键』实现,,操作方法是利用电源键和音量键,现在有了Home键就开始使用这种操作方式. 说明:红米4的菜单键就是三颗虚拟按键最最左边的那个按键,此外电源键+音量-键是不能实现截屏的. ②红米4截图方法二:下拉菜单 手机设置--通知栏和下拉菜单在截图界面,只要下拉就可以看到截图按钮了. ②红米4截图方法三:借助第三方APP 这个不介绍QQ之类都有这个截图功能的哦.

荣耀7截图截屏方法3种

荣耀7截图方法一:组合快捷键截图 同样的,荣耀7为安卓手机,所以传统的截图方法肯定是少不了的,我们同时按下[电源键]+[音量-键]然后会有拍照声音,这个就代表截图完成,如下图所示: 荣耀7截图方法二:下拉菜单开关快捷截屏 另一种截屏方法就是下拉菜单进行截图,我们使用手指将屏幕向下滑动一下看到[截屏]然后我们点击一下截屏案即可截屏了. 荣耀7截图方法三:指关节截屏 指关节截屏是一种可以识别手指指肚和指关节的不同敲击感应实现的方式,用指关节双击屏幕为全屏截图,指关节在屏幕上画圈为部分截取,小截屏,大

Android中3种全屏方法及3种去掉标题栏的方法

这篇文章主要介绍了Android中3种全屏方法及3种去掉标题栏的方法,二个问题各给出了3种解决方法,并给出实例代码,需要的朋友可以参考下     一.去掉标题栏的方法 第一种:入门的时候经常使用的一种方法 代码如下: requestWindowFeature(Window.FEATURE_NO_TITLE); //去掉标题栏注意这句一定要写在setContentView()方法的前面,不然会报错的 第二种:在AndroidManifest.xml文件中定义 代码如下: <application

oppo r7s手机4种截屏截图方法

oppo r7s截图方法教程 方法一:最简单快捷的截图方式,进入截图界面然后按下"电源键"加"音量减键",一起按住即可轻松截屏. 方法二:手机自带的功能,一在进入到oppor7s手机的界面我们点击"设置"--"常规"--"手势体感"--将"三指截屏"开启,在屏幕任意界面位置三指向上或者向下滑动即可截屏. 方法三:长截屏方法,这种方法和方法一有一点像了,我们只要在截图界面 电源键加减音键一

C#中三种截屏方式总结

昨天写自动化测试的CASE的时候,碰到一个疑难杂症,调用截图的函数去截取一个Popup窗口,但是总是把背景程序给截下来,Popup窗口就跟看不到一样.本来以为是同步的问题,也就是以为先截图再点击弹出Popup窗口了.后来加了N个Thread.Sleep来测试,发现根本不是因为这个原因,而是截图的函数截不下来这个窗口. 这个为啥呢,只好把截图的函数代码翻出来看,以前是用这种方式的: BitBlt(dcImage, 0, 0, (int)(rect.Width), (int)(rect.Height

XP系统的三种锁屏方法及其优缺点介绍

XP系统的三种锁屏方法及其优缺点介绍   1.不使用欢迎屏幕(此时亦不能使用快速用户切换). 2.仅使用欢迎屏幕. 3.既使用欢迎屏幕,又使用快速用户切换. 当安装完Windows XP后,默认的设置是3. 下面根据"用户登录或注销的方式"设置的不同,分别介绍其锁屏的方法. 设置1:同Windows 2000和Windows NT4.0 使用方法完全相同,界面也类似. 优点:是真正的"锁定计算机",在你锁定了计算机后,其他用户(管理员除外)就不能使用此计算机. 缺点