天天看点

第一个 WP 程序 : 手机条码扫描枪

前言碎语:

前段时间,我第一时间尝试了 windows 8.1 update1 , 结果把我硬盘搞挂了!

升级之后,硬盘一直是100%,平均响应时间能高达400多毫秒。

我自认为我的配置还不错,amd的4核推土机,8g金仕顿骇客神条, 1t的希捷单碟,两年多点,以前跑 win7 / win8 / win 8.1

都不带眨眼的,怎么遇到tmd win 8.1 update 1

就变成渣了呢?基本每次启动都要自动修复一下,开机后在磁盘管理里还提示有危险。用检查工具检查了一下,有二十多个坏道,但是没办法修复!弄的头大!耽误了4天时间,窝了一肚子火!最终还是买了块ssd,完事!

之前写了一个用在 android 上的小应用:

今天在来一个:手机条码扫描枪 windows phone 8.1 版,不过还没有研究怎么发布到应用商店中。

直到现在,我还没有弄明白 windows phone项目 和 windows phone silverlight 项目到底有什么区别。

一开始,我新建了一个 windows phone 项目,但是死活不能用

videobrush 这个东西,折腾了两天,才在 sakeoverflow 上找找到答案:videobrush 在 windows phone

silverlight 项目中才有。

另外,我安装了 vs 2013 update 2 rc, 可以新建 windows phone 8.1 的应用,在 windows phone

项目下可以使用那些 flip 之类的新控件,但是在 silverlight 里仍然没有搞懂如何才能使用这些新的东西。

和我的第一个wpf桌面程序一样,windows phone 程序依然是用 caliburn.micro (cm) 框架,不过有些问题,

mvvm的model层不过问view上有什么东西,但是我这里需要获取view上的某一块的位置和大小,用数据绑定的方式处理的这一块,非常不理想。

用cm框架,必须要按照约定来命名 view 和 model,当然可以更改默认的规则。如下图:

第一个 WP 程序 : 手机条码扫描枪

xxxpageviewmodel.cs 对应 xxxpage.xaml 。

一开始我以为model的命名中不需要 page ,结果无论如何都不能定位到 model上(cm在windows phone 上是view优先)

 搞成这个样子(views / viewmodels),还要改两个地方:package.appxmanifest (入口点) 和

properties 下面的 wmappmanifest.xaml (导航页),我这里指向 views/homepage.xaml

要用 cm,当然还需要用 cm的 bootstrapper

第一个 WP 程序 : 手机条码扫描枪
第一个 WP 程序 : 手机条码扫描枪

bootstrapper.cs

第一个 WP 程序 : 手机条码扫描枪
第一个 WP 程序 : 手机条码扫描枪

app.xaml

界面我弄的也很简单,因为到目前为止,我还没来得及搞懂“中心应用程序”和“透视应用程序”有什么区别,不过,他们有一个共性:挺丑的。我的应用就4个页面,神马中心透视都没有必要。

第一个 WP 程序 : 手机条码扫描枪
第一个 WP 程序 : 手机条码扫描枪
第一个 WP 程序 : 手机条码扫描枪
第一个 WP 程序 : 手机条码扫描枪

定义这个六边形按钮的时候,发现 controltemplate 没有 triggers 这个东西,也不知道如何才能给按钮加上响应触摸的效果,和桌面应用还是有很大差别的。

前面说了在 videobrush 上耗了两天,是因为我要用它把镜头输出到屏幕上,除了用 videobrush 我还不知道有什么其它的办法。

这是不用mvvm的写法:

一目发然, compositetransform 那句是说,按照屏幕的中心点旋转90度,因为我的手机 (撸妹925)输出的镜头是90度的,不知道其它手机是不是也是这样。

但是我用了 cm,必须用mvvm,这些东西都要放到 model

里去设置,

然后将这个 vbrush 绑定到 rectangle的fill 上。

前面说了要在model里取view上的某块区域的起点和大小,是因为镜头下可能有n个条形码,如果不指定区域的话,就不知道目的条码是哪一个。

zxing (我用的zxing) 不像 zbar, zbar 有个 scancrop

,通过它可以限定识别区域(参见:http://www.cnblogs.com/xling/archive/2013/03/21/2972640.html)

zxing 要限定识图区域,只能自行截取了。

photocaramer的 getpreviewbuffery 、 getpreviewbufferargb32

和 getpreviewbufferycbcr 获取到的数据都是一个像素一个像素按行罗列的的一维数组(具体里面存的是什么,我也不懂)比如:

1,2,3,4

5,6,7,8

9,10,11,12

一个高3宽4像素的图片,用上面的方法都是返回诸如:1,2,3,4,5,6,7,8,9,10,11,12 这样一个一维数组。

结合到镜头返回的图像是顺时针旋转90度的,我写了这么个方法:

第一个 WP 程序 : 手机条码扫描枪
第一个 WP 程序 : 手机条码扫描枪

view

code

这个方法还有待优化,应该是先截取,再旋转的,我把这个过程弄翻了。

另外,在扫描的时候,采用了“循环” 的 对焦/拍照/扫描,而不是手动的去点一下拍照并扫描一下,因为识别率并不高。

扫描成功后,本来是想通过 tcpclient 传到电脑端的,但是 windows phone

sdk里并没有这个东西,不过可以直接用 socket,用了msdn上的示例代码,做了一点点简单的修改:

附上源码(没有开发者账户,而且还不想出钱购买,还没有达到那个高度):

http://files.cnblogs.com/xling/barcodescanner.7z

电脑端:

http://files.cnblogs.com/xling/tns2.7z