用MVVM模式开发中遇到的零散问题总结(4)——自制摄像头拍摄大头贴控件
原文:用MVVM模式开发中遇到的零散问题总结(4)——自制摄像头拍摄大头贴控件
一直有个疑问,为什么silverlight对摄像头支持这么好,WPF却一个库都没有....于是我各种苦恼啊,各种CodeProject啊,终于让我找到海外兄弟写的源码了,原理是通过不断向摄像头读取图片不断刷新到窗体控件上。有Demo就直接封个控件呗,具体怎么实现的也忙不得管它了....
功能还是十分不错呢。特别是它拍照后添加到列表里的动画效果十分不错哦~~
核心就是这几个类了,由于原作者估计很喜欢MVVM所以通过各种Command来控制的,不能直接导航看着有点头昏。我就自己的风格封了个简单易懂的控件。
新建一个工程,把这个文件夹添加进工程后,新建用户控件
前台代码:
xmlns:camPlayer="clr-namespace:CatenaLogic.Windows.Presentation.WebcamPlayer"
<camPlayer:CapPlayer x:Name="camPlayer" RenderTransformOrigin="0.5,0.5" >
<camPlayer:CapPlayer.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleY="-1" ScaleX="1"/>
<SkewTransform AngleY="0" AngleX="0"/>
<RotateTransform Angle="0"/>
<TranslateTransform/>
</TransformGroup>
</camPlayer:CapPlayer.RenderTransform>
</camPlayer:CapPlayer>
其实就一句话,主要是不知道为什么出现的效果是上下颠倒的,所以我给上下翻转下....
后台代码:
public ImageSource imgSource
{
get { return (ImageSource)GetValue(imgSourceProperty); }
set { SetValue(imgSourceProperty, value); }
}
public static readonly DependencyProperty imgSourceProperty =
DependencyProperty.Register("imgSource", typeof(ImageSource), typeof(CopCamPlayer), null);
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
camPlayer.Device = new CapDevice();
camPlayer.Device.MonikerString = CapDevice.DeviceMonikers[].MonikerString;//设置通过哪个设备
}
//拍照片
public void CaptureImage()
{
imgSource = camPlayer.CurrentBitmap;
}
//停止摄像头占用
private void UserControl_Unloaded(object sender, RoutedEventArgs e)
{
camPlayer.Device.Stop();
GC.Collect(); //回收垃圾,不然停止不了占用
}
注意:一定要调用GC.Collect();强制回收一下垃圾,不然摄像头依然被占用(从c#发家的我,被这个坑惨了T_T)
其中拍的照片imgSource定义成依赖项属性方便Image控件直接绑定数据源。CaptureImage()方法的调用可以通过添加行为实现:
<Grid x:Name="圆形按钮" Height="56" Margin="0,0,335.333,119" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="59.333">
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeftButtonDown">
<ei:CallMethodAction TargetObject="{Binding ElementName=copCamPlayer}" MethodName="CaptureImage"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Grid>
<Image HorizontalAlignment="Right" Margin="0,250,67.5,163" Width="242" Source="{Binding imgSource, ElementName=copCamPlayer}"/>
其中CopCamPlayer就是上面代码封好的控件,而CallMethodAction可以调用的方法需要满足无参数,无返回值就行。image控件绑定到拍照的结果属性上,这样点击圆形按钮就可以拍照拉~~
哈哈还是简单呢,主要外国友人封的好啊,附上外国友人源代码:
http://files.cnblogs.com/tong-tong/WebcamPlayer_1.1.zip
这个类的功能不仅于此,本人现在比较忙没仔细研究,各位有发现什么新功能告知我,thx。
用MVVM模式开发中遇到的零散问题总结(4)——自制摄像头拍摄大头贴控件的更多相关文章
- 用MVVM模式开发中遇到的零散问题总结(5)——将动态加载的可视元素保存为图片的控件,Binding刷新的时机
原文:用MVVM模式开发中遇到的零散问题总结(5)--将动态加载的可视元素保存为图片的控件,Binding刷新的时机 在项目开发中经常会遇到这样一种情况,就是需要将用户填写的信息排版到一张表单中,供打 ...
- 用MVVM模式开发中遇到的零散问题总结(2)
原文:用MVVM模式开发中遇到的零散问题总结(2) 本节目录: 1.解决动画属性被劫持问题 2.设置页面焦点默认所在对象 3.XAML模拟键盘按键 4.DataGrid数据源绑定到复杂格式(dynam ...
- 用MVVM模式开发中遇到的零散问题总结(3)——自制正则表达式万能绑定转换器
原文:用MVVM模式开发中遇到的零散问题总结(3)--自制正则表达式万能绑定转换器 前言 最近接受了3个项目的洗礼,出差近3个月,各种北京.广州.昆明来回奔波,好久没写博客了,之前我觉得我遇到的问题都 ...
- 用MVVM模式开发中遇到的零散问题总结(1)
https://www.cnblogs.com/tong-tong/archive/2011/11/28/2250948.html
- ASP.NET开发中主要的字符验证方法-JS验证、正则表达式、验证控件、后台验证
ASP.NET开发中主要的字符验证方法-JS验证.正则表达式.验证控件.后台验证 2012年03月19日 星期一 下午 8:53 在ASP.NET开发中主要的验证方法收藏 <1>使用JS验 ...
- 【WPF开发备忘】使用MVVM模式开发中列表控件内的按钮事件无法触发解决方法
实际使用MVVM进行WPF开发的时候,可能会用到列表控件中每行一个编辑或删除按钮,这时直接去绑定,发现无法响应: <DataGridTemplateColumn Header="操作& ...
- C/S模式开发中如何利用WebBrowser控件制作导航窗体
原文:C/S模式开发中如何利用WebBrowser控件制作导航窗体 转自: CSDN 相信不少同学们都做过MIS系统的开发,今天这里不讨论B/S模式开发的问题.来谈谈winform开发.用过市面上常见 ...
- 学习方法和阶段介绍 、 iOS界面开发引入 、 构造第一个App 、 视图控制器和视图 、 控件与事件 、 InterfaceBuilder
1 创建并运行第一个App 1.1 问题 使用Xcode创建一个App项目,该应用实现功能在界面上显示Hello World标签,在模拟器中的运行结果如图-1所示: 图-1 1.2 方案 分析图-1, ...
- Android 基于MVC的MVVM模式开发
由skay整理 http://blog.csdn.net/sk719887916/article/details/50386144 什么是MVVM 我们一步步来,从MVC开始. MVC 我们都知道, ...
随机推荐
- CISCO - 查找命令行
http://www.cisco.com/c/en/us/support/web/tools/help/command_search_best_practices.html Support Best ...
- Android—— ubuntu下【CTS】測试TV真机
近期接触到CTS,据传不懂CTS就不算一个合格的android开发者,我之前一直没见周边谁用过.作为一个产品开发的android人员,我还是太年轻- 撰写不易,转载请注明出处:http://blog. ...
- 海思hi3716c机顶盒接usb摄像头和usb无线耳机时,无线耳机有时没有声音
两个USB设备各自是: A:USB摄像头带录音功能,但不带放音功能. B:USB无线耳机是使用USB转2.4G的无线耳机. 详细现象: 1, A,B两者同一时候插上机顶盒,并开机进入android,此 ...
- 稀疏编码(sparse code)与字典学习(dictionary learning)
Dictionary Learning Tools for Matlab. 1. 简介 字典 D∈RN×K(其中 K>N),共有 k 个原子,x∈RN×1 在字典 D 下的表示为 w,则获取较为 ...
- 【dotnet跨平台】Asp.net 正在经历的变革
[dotnet跨平台]Asp.net 正在经历的变革 Asp.net 正在经历一场变革.从官网:https://get.asp.net/ 我们能够看到多个版本号的字眼例如以下: ASP.NET ...
- 【t007】棋盘放置指南车问题
Time Limit: 1 second Memory Limit: 50 MB [问题描述] 按照国际象棋的规则,车可以攻击与之处在同一行或同一列上的棋子.指南车是有方向的车.横向指南车可以攻击与之 ...
- http协议头文件的控制信息(转)
通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息.这两种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成.HTTP的头域包括通用头,请求头,响应 ...
- Tricks(四十八)—— 注释一段代码
为 if 的条件判断表达式,传一个永假的语句,来注释一段代码: # Python if False: ... ... ... # C/C++ if (false) { ... ... } 永远不要直接 ...
- 常规容器下SpringBootServletInitializer如何实现web.xml作用解析
在之前的<使用jsp作为视图模板&常规部署>章节有过一个实践,需要启动类继承自SpringBootServletInitializer方可正常部署至常规tomcat下,其主要能够起 ...
- maven webcollector java.lang.ClassNotFoundException: org.openqa.selenium.remote.SessionNotFoundException
使用webcollector时出现了如下异常 分析是依赖的问题,不仅要添加selenium-java,还要添加htmlunit-driver的依赖,注意不要添加成selenium-htmlunit-d ...