wpf使用WPFMediaKit调用平板(surface2)摄像头拍照
wpf中怎么调用surface(或者其他平板)的摄像头进行拍照那?今天分享一下使用WPFMediaKit调用平板(surface2)摄像头拍照。
下载最新的代码,加入到项目中。
2、test项目引用WPFMediaKit
xaml代码:
代码如下 | 复制代码 |
<Window x:Class="test.WPFMediaKitWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:wpfmedia="clr-namespace:WPFMediaKit.DirectShow.Controls;assembly=WPFMediaKit" Title="WPFMediaKitWindow" Loaded="Window_Loaded"WindowState="Maximized"> <Grid> <StackPanel Orientation="Vertical"> <StackPanel Orientation="Horizontal"> <ComboBox Name="cb" SelectionChanged="cb_SelectionChanged" Width="100" /> <Button Content="打开摄像头" x:Name="btnOpen" Click="btnOpen_Click"Width="100"/> <Button Content="拍照" x:Name="btnCapture" Click="btnCapture_Click"Width="100" /> <Button Content="保存" x:Name="btnSave" Click="btnSave_Click" Width="100" /> </StackPanel> <wpfmedia:VideoCaptureElement Name="vce" /> </StackPanel> </Grid> </Window> |
后台代码:
获取摄像头:
代码如下 | 复制代码 |
private void cameraOpen() { cb.ItemsSource = MultimediaUtil.VideoInputNames; if (MultimediaUtil.VideoInputNames.Length > 1) { cb.SelectedIndex = 1; } else { cb.SelectedIndex = 0; } } |
拍照保存到硬盘:win8注意有文件夹的权限问题
代码如下 | 复制代码 |
|
在我安装、配置好PhoneGap项目的所有依赖后,试图执行
$ cordova run android
命令时,出现过如下错误。
Error: /home/sam/front/redwine/platforms/android/cordova/run: Command failed with exit code 8
at ChildProcess.whenDone (/usr/lib/node_modules/cordova/node_modules/cordova-lib/src/cordova/superspawn.js:135:23)
at ChildProcess.EventEmitter.emit (events.js:98:17)
at maybeClose (child_process.js:743:16)
at Process.ChildProcess._handle.onexit (child_process.js:810:5)
view rawphonegapError hosted with ❤ by GitHub
cordova build android或cordova emulate android的结果也是一样。
但其实真正的问题在上面几行:
[aapt] (skipping file '.jshintrc' due to ANDROID_AAPT_IGNORE pattern '.*')
[aapt] (skipping file '.bower.json' due to ANDROID_AAPT_IGNORE pattern '.*')
[aapt] (skipping file '.directory' due to ANDROID_AAPT_IGNORE pattern '.*')
[aapt] Unable to add '/home/sam/front/redwine/platforms/android/assets/www/bower_components/jquery-mobile/node_modules/grunt-bowercopy/node_modules/bower/node_modules/semver/semver.browser.js.gz': file already in archive (try '-u'?)
[aapt] ERROR: unable to process assets while packaging '/home/sam/front/redwine/platforms/android/ant-build/wine.ap_'
[aapt] ERROR: packaging of '/home/sam/front/redwine/platforms/android/ant-build/wine.ap_' failed
BUILD FAILED
/home/sam/bin/android-sdk-linux/tools/ant/build.xml:932: The following error occurred while executing this line:
/home/sam/bin/android-sdk-linux/tools/ant/build.xml:950: null returned: 1
view rawphonegapError2 hosted with ❤ by GitHub
这是因为项目下有多个node_modules目录,被重复打包而引发的Command failed with exit code 8问题。
解决办法是修改platforms/android/build.xml:
<property name="aapt.ignore.assets" value="<dir>node_*" />
将node_modules目录排除掉,就可以正常执行cordova命令。
移动手机中实现端文件上传是现在WEB开发中也需要考虑到的一个问题,在这里我们来介绍使用XMLHttpRequest 结合Nodejs实现移动端文件上传了,下面我们一起来看看相关例子吧,希望文章能给各位带来帮助哦。input[type="file"] 可以选择手机里的文件,还可以调用拍照功能(某些浏览器不行),Form 表单如下:
代码如下 | 复制代码 |
<form id="upload-form" action="/upload" enctype="multipart/form-data" method="post"> <input id="selece-files" type="file" name="fileToUpload" /> <input id="do-upload" type="submit" value="上传" /> </form> |
这里做单文件上传,多文件上传可以给 input[type="file"] 加个 multiple 属性便可。当触发 submit 事件提交:
代码如下 | 复制代码 |
upload.submit = function() { // xhr.upload 在 iOS Safari、 大部分 Android 4.0+ 的自带浏览器、Chrome 都支持 xhr.open('post', form.action, false); // 可以在 onProgress 的时候处理进度条 upload.onError = function() {} // 上传完成 return upload; })(window, window.Upload || {}); |
Server 端用了 formidable 这个中间件:npm install formidable。
当然不用 formidable 也能处理文件上传。
代码如下 | 复制代码 |
var fs = require('fs'), app.post('/upload', function(req, res) { // formidable 属性设置可以参考 github 上说明 form.parse(req, function(err, fields, files) { // 我们可以在文件上传完成后移到放置文件的目标目录 |
一. 关于用户数据存储
首先在注册的协议里,定义如下公共传输字段:
version: 这个其实是xml中配置的versionCode。versionName个人认为没有什么必要,所以就不传了。
channel: 用户渠道,这个和xml中的UMENG_CHANNEL 是共用的,因为一直在使用umeng,所以这样定义反而清楚一些。
device_id: 设备ID
os: 操作系统类型,这里默认传入android
os_version: 操作系统版本
对于小数据量,用户数据存储在mysql中是相对较好的选择,这里直接以django的model为例:
代码如下 | 复制代码 |
from django.db import models class User(models.Model): device_id = models.CharField(max_length=255, null=True, blank=True) version = models.IntegerField() channel = models.CharField(max_length=64, null=True, blank=True) os = models.CharField(max_length=64, null=True, blank=True) os_version = models.CharField(max_length, null=True, blank=True) create_time = models.DateTimeField(default=get_cur_time) login_time = models.DateTimeField(default=get_cur_time) |
如果需要用到如facebook之类的联合登录,对于小规模的服务,我个人倾向于不破坏User的定义,因为毕竟这种联合登录什么时候会加入很难预知:
代码如下 | 复制代码 |
class FBUser(models.Model): # facebook 用户ID userid = models.CharField(max_length=32, unique=True) # User.id,这里不用外键,是为了以后拆分表或者换数据存储留下后路 native_id = models.IntegerField(default=0) def __unicode__(self): return '%s->%s' % (self.userid, self.native_id) |
其他的业务相关的字段定义就由业务自己决定了。
我不是很建议在未来可能数据量很大的表里使用 外键,因为很可能以后要设计到分库分表、或者迁移数据到redis、mongodb之类的,这在我之前的博文里面就有提到过,大家有兴趣可以看一下。
二. 关于通信协议的选择
其实这块还真的有不少东西可以说的。
HTTP
最简单的肯定是用http协议,但是http协议在手机应用上其实只能满足传统一收一发的需求,即使是使用long poll之类技术,经过我测试,当在3G网络下时,运营商经常会强制返回http请求为502错误。
WebSocket
当然,如果对http还是心有所属,可以使用 websocket,经过测试 websocket还是比较好用的,cocos2d-x 有专门提供websocket的封装,android下也有专门的websocket的库: AndroidAsync
python也提供了很多websocket的server和client。比如server端有 gevent-websocket、以及在其基础上开发的flask plugin: flask-sockets。当然django也是可以直接使用gevent-websocket的,django还有一个不基于gevent的版本:django-websocket。client端有 websocket-client。
基于gevent的server之前测试过,可以正常的收到断掉链接的消息,逻辑处理也都比较正常。最终要的一点是,他可以和现有http服务器无缝结合,不需要做跨进程在两个server间通讯。
SocketIO
这个我也测试过,但是实在不建议大家在项目中使用,他做了太多的兼容的事情了,而我们客户端又不是浏览器,根本不需要考虑那么多事情,只要用一种协议就可以了。
还有一点就是,我试了下python的socketio server似乎有点问题,在客户端主动close链接时,服务器端并没有收到事件,而只有客户端发送disconnect命令才会触发服务器端的相关事件。这个事情在网上查了一下,貌似是官方故意做的处理,防止浏览器在刷新时触发一些奇怪的事情,但是这样处理对于我是无法忍受的。
不过还是把相关的链接发给大家,大家可以试一下。android客户端:还是 AndroidAsync。 python server端:Flask-SocketIO,django-socketio,python client端:socketIO-client。
原生socket+自定义协议
这种方式灵活度肯定是最高的,但是相应的开发难度肯定也会增大。协议可以使用json或者google 的 protobuf。这个可能一两句话还说不清楚,下一篇我们专门花篇幅聊一下。
今天遇到这样一个bug:客户端POST到服务器的一段数据导致服务器端发生未知异常。服务器端确认是编码转换错误。于是截取网络数据包进行分析,发现客户端POST的json数据中包含下面一段(hex形式):
... 61 64 20 b7 20 52 69 63 ...
问题就出在这个b7上。查阅Unicode代码表后发现,U+00b7是MIDDLE DOT,它的UTF-8表现形式应该是c2 b7,但为何客户端发送的数据中它变成了b7?
由于系统使用了ormlite、gson和async-http几个库,于是逐一排查。最后发现原来是向服务器发送数据时没有指定文字编码,导致async-http(实际是apache common http client)将数据以ISO-8559-1格式发送,U+00b7被编码成b7,然后服务器试图使用UTF-8解码时发生错误。
出错的代码片段如下:
代码如下 | 复制代码 |
Gson gson = new Gson(); |
第三行new StringEntity(json)时没有指定编码导致错误。改正后如下:
代码如下 | 复制代码 |
Gson gson = new Gson(); |
相关文章
- 这篇文章主要介绍了Spring AOP 对象内部方法间的嵌套调用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-08-29
- 有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
- ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。  ...2017-07-06
- <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
- 这篇文章主要介绍了c# 三种方法调用WebService接口的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-07
- 许多的朋友对于Plesk控制面板应用不是非常的了解特别是英文版的Plesk控制面板,在这里小编整理了一些关于Plesk控制面板常用的使用方案整理,具体如下。 本文基于Linu...2016-10-10
使用insertAfter()方法在现有元素后添加一个新元素
复制代码 代码如下: //在现有元素后添加一个新元素 function insertAfter(newElement, targetElement){ var parent = targetElement.parentNode; if (parent.lastChild == targetElement){ parent.appendChild(newEl...2014-05-31- 大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
使用percona-toolkit操作MySQL的实用命令小结
1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24如何使用php脚本给html中引用的js和css路径打上版本号
在搜索引擎中搜索关键字.htaccess 缓存,你可以搜索到很多关于设置网站文件缓存的教程,通过设置可以将css、js等不太经常更新的文件缓存在浏览器端,这样访客每次访问你的网站的时候,浏览器就可以从浏览器的缓存中获取css、...2015-11-24jQuery 1.9使用$.support替代$.browser的使用方法
jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support 。 在更新的 2.0 版本中,将不再支持 IE 6/7/8。 以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9。 如果要全面支持 IE,并混合...2014-05-31- 一、下载 mysqlsla [root@localhost tmp]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz--19:45:45-- http://hackmysql.com/scripts/mysqlsla-2.03.tar.gzResolving hackmysql.com... 64.13.232.157Conn...2015-11-24
安装和使用percona-toolkit来辅助操作MySQL的基本教程
一、percona-toolkit简介 percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括: 检查master和slave数据的一致性 有效地对记录进行归档 查找重复的索...2015-11-24- C#注释的一些使用方法浅谈,需要的朋友可以参考一下...2020-06-25
- 这篇文章主要介绍了js实现调用网络摄像头及常见错误处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-07
- 目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识...2015-10-30
- 无限级分类在开发中经常使用,例如:部门结构、文章分类。无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式; 查找分类A下面所有分类包含的文章。1.实现原理 几种常见的实现方法,各有利弊。其中...2015-10-23
- php类的使用实例教程 <?php /** * Class program for yinghua05-2 * designer :songsong */ class Template { var $tpl_vars; var $tpl_path; var $_deb...2016-11-25
- 这篇文章介绍了c#动态调用Webservice的两种方法实例,有需要的朋友可以参考一下...2020-06-25
- 这篇文章主要给大家介绍了关于c#中的WebService及其调用方式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25