windows phone 扫描二维码
在网上找了找扫描二维码的例子,利用ZXing库实现(下载),提供的Silverlight版本的下载,在网上搜了一下已经有wp的dll可用了,不过网上实现的条码扫描的例子还都是用的Silverlight版本的dll。有个例子感觉写的不错能学到东西,就模仿着写了写。
public static class BarCodeManager
{
internal static Action<string> BarCodeFound;
internal static Action<Exception> Error; static BarCodeManager()
{ } /// <summary>
/// 启动条码扫描
/// </summary>
/// <param name="barCodeFound">扫描成功执行的操作</param>
/// <param name="error">扫描失败的操作</param>
/// <param name="barcodeFormat">编码类型,默认为ean_13条形码</param>
public static void StartScan(Action<string> barCodeFound, Action<Exception> error, BarcodeFormat barcodeFormat = null)
{
var mainFrame = Application.Current.RootVisual as PhoneApplicationFrame;
if (mainFrame != null)
{
if (barcodeFormat == null)
{
barcodeFormat = BarcodeFormat.EAN_13;
}
BarCodeFound = barCodeFound;
Error = error;
ZXingReader = GetReader(barcodeFormat); mainFrame.Navigate(new Uri("/ScanCode.xaml", UriKind.Relative));
} } private static Reader zXingReader; public static Reader ZXingReader
{
get
{
if (zXingReader == null)
{
return new EAN13Reader();
}
return zXingReader;
}
set { BarCodeManager.zXingReader = value; }
} internal static Reader GetReader(BarcodeFormat format)
{
Reader r;
switch (format.Name)
{
case "CODE_128":
r = new Code128Reader();
break;
case "CODE_39":
r = new Code39Reader();
break;
case "EAN_13":
r = new EAN13Reader();
break;
case "EAN_8":
r = new EAN8Reader();
break;
case "ITF":
r = new ITFReader();
break;
case "UPC_A":
r = new UPCAReader();
break;
case "UPC_E":
r = new UPCEReader();
break;
case "QR_CODE":
r = new QRCodeReader();
break;
default:
r = null;
break;
}
return r;
}
}
Action<>这个第一次接触到,要扫描条码信息就调用类的StartScan方法,跳转到ScanCode.xaml 启动扫描。通过第一个参数(Action<string> barCodeFound) 返回扫面的结果。
ScanCode.cs代码
public partial class ScanCode : PhoneApplicationPage
{
PhotoCamera photocamera;
VideoBrush videoBrush = new VideoBrush();
byte[] buffer = null;//存储photocamera 获取的亮度数据
Result result = null; public ScanCode()
{
InitializeComponent();
} protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
if (photocamera == null)
{
photocamera = new PhotoCamera();
photocamera.Initialized += new EventHandler<CameraOperationCompletedEventArgs>(photocamera_Initialized);
photocamera.AutoFocusCompleted += new EventHandler<CameraOperationCompletedEventArgs>(photocamera_AutoFocusCompleted);
video.Fill = videoBrush;
videoBrush.SetSource(photocamera);
} base.OnNavigatedTo(e);
} protected override void OnNavigatingFrom(System.Windows.Navigation.NavigatingCancelEventArgs e)
{
if (photocamera != null)
{
//删除事件处理 msdn备注
photocamera.Initialized -= photocamera_Initialized;
photocamera.AutoFocusCompleted -= photocamera_AutoFocusCompleted;
photocamera.CancelFocus();
photocamera.Dispose();
}
base.OnNavigatingFrom(e);
}
//对焦操作完成发生
void photocamera_AutoFocusCompleted(object sender, CameraOperationCompletedEventArgs e)
{
result = null;
try
{
while (result == null)
{
var binaryBitmap = GetBitmapFromCamera();
if (binaryBitmap != null)
{
try
{
result = BarCodeManager.ZXingReader.decode(binaryBitmap);
}
catch
{
}
}
}
if (result != null)
{
BarCodeManager.BarCodeFound(result.Text);
}
else
{
//再次执行相机聚焦操作,也可以用DispatcherTimer周期执行GetBitmapFromCamera获取解码数据
photocamera.Focus();
}
}
catch (Exception ex)
{
//BarCodeManager.Error(ex);
}
} void photocamera_Initialized(object sender, CameraOperationCompletedEventArgs e)
{
photocamera.FlashMode = FlashMode.Auto;
photocamera.Focus();
}
/// <summary>
/// 获取摄像头扫描的图像
/// </summary>
/// <returns></returns>
BinaryBitmap GetBitmapFromCamera()
{ BinaryBitmap binaeryBitmap = null;
try
{
var pixelWidth = (int)photocamera.PreviewResolution.Width;
var pixelHeight = (int)photocamera.PreviewResolution.Height;
if (buffer == null || buffer.Length != (pixelHeight * pixelWidth))
{
buffer = new byte[pixelWidth * pixelHeight];
}
//捕捉亮度数据,创建HybridBinarizer和BinaryBitmap类,返回BinaryBitmap给Reade对象解码
photocamera.GetPreviewBufferY(buffer);
var luminance = new RGBLuminanceSource(buffer, pixelWidth, pixelHeight, true);
var binarizer = new HybridBinarizer(luminance);
binaeryBitmap = new BinaryBitmap(binarizer);
}
catch
{
}
return binaeryBitmap;
}
}
调用代码,调用StartScan,完成条码扫描,所有的操作完全可以写在一个ScanCode类中,这种设计是可以在封装成一个dll,在外部直接调用
BarCodeManager.StartScan(
(r) => Dispatcher.BeginInvoke(() =>
{
tbScanResultBarCode.Text = r;
NavigationService.GoBack();
}),
null
);
OK!纯属来帖代码来了,,,,,,
windows phone 扫描二维码的更多相关文章
- windows rt 扫描二维码
项目中使用的是ZXing.net,应用商店程序.使用到的dll是ZXing.winmd. 大致思路为,使用MediaCapture捕获图片.获取到CapturePhotoToStreamAsync流, ...
- Ionic2学习笔记(10):扫描二维码
作者:Grey 原文地址: http://www.cnblogs.com/greyzeng/p/5575843.html 时间:6/11/2016 说明: 在本文发表的时候(2016-06-1 ...
- 实现手机扫描二维码页面登录,类似web微信-第一篇,业务分析
转自:http://www.cnblogs.com/fengyun99/p/3541249.html 关于XMPP组件的文章,先休息两天,好歹已经完整的写了一份. 这两天,先实现一套关于web微信扫描 ...
- windows phone 生产二维码和解码本地二维码图片
前面模仿着写了一个手机扫描二维码和条形码的例子,zxing(下载)的Silverlight库实现的,当时还纳闷有windows phone的库为什么不用,其实都是一样的,,,要改的就是获取摄像头获取的 ...
- [置顶]
xamarin android使用zxing扫描二维码
好久没写了,这片文章篇幅不长,概述一下在xamarin android中用 ZXing.Net.Mobile库扫描二维码读取url的示例.扫码支付,扫码登录,App上各种各样的扫码,好像没个扫码的就有 ...
- .net实现扫描二维码登录webqq群抓取qq群信息
一.流程 1. //获得二维码的qrsig,cookie标志 2. //登录二维码获得二维码的状态,及最新的url 3. //登录此网址,获得Cookies 4.//cookies,筛选出skey信息 ...
- SNF开发平台WinForm-平板拍照及扫描二维码功能
在我们做项目的时候,经常会有移动平板处理检验,审核等,方便移动办公.这时就需要在现场拍照上传问题,把当场问题进行上传,也有已经拍完照的图片或加工过的图片进行上传.还有在车间现场一体机,工控机 这种产物 ...
- iOS使用Zbar扫描二维码
iOS使用Zbar扫描二维码 标签(空格分隔):二维码扫描 iOS Zbar64位 正文: 首先下载一个支持64位系统的ZbarSDK的包,保存在了我的云盘里,地址:ZbarSDK 把文件拖到工程里面 ...
- 制作IOS企业版App网页扫描二维码下载安装
有时候我们需要在XX网站的主页上去扫描二维码下载,那么ios开发中如何做到这一点呢. 我给大家解答一下,这也是在最近工作中用到的部分,在网上了解了一些. 下面给大家分解一下步骤: 1.Plist 和 ...
随机推荐
- 辗转相除法求最大公约数和最小公倍数【gcd】
要求最小公倍数可先求出最大公约数 设要求两个数a,b的最大公约数 伪代码: int yushu,a,b: while(b不等于0) { yushu=a对b求余 b的值赋给a yushu的值赋给b } ...
- 用户名 不在 sudoers文件中,此事将被报告
解决方法: 1.通过编辑器来打开/etc/sudoers 2.直接使用命令visudo 打开sudoers后,如下加上自己的帐号保存后就可以了. # User privilege specificat ...
- UAF漏洞--iOS是越狱原理
Use After Free UAF 就是 Use After Free的缩写,是一种比较常见的内存错误式利用.很多iOS的越狱都是利用的这种方法.在此简单的举个例子说明UAF出现的情况 代码说明一切 ...
- jqgrid使用简单记录
我要为id为jqGrid的table使用jqgrid插件. $("#jqGrid").jqGrid({ url: 'data/test.json', mtype: "GE ...
- Windows下FFmpeg高速入门
本系列文章导航 Windows下FFmpeg高速入门 ffmpeg參数解释 mencoder和ffmpeg參数具体解释(Java处理视频) Java 生成视频缩略图(ffmpeg) 使用ffmpeg进 ...
- Linux下Join命令
Linux下Join命令 最近新上线算法,打算分析起点书籍点击率的波动,原来已经有流程每天每本书籍的点击率数据(文件).之前这种情况都是写代码对不同天的进行合并,后来发现linux下直接就有join命 ...
- [React] React Fundamentals: Component Lifecycle - Updating
The React component lifecycle will allow you to update your components at runtime. This lesson will ...
- [React] React Fundamentals: transferPropsTo
the transferPropsTo method lets you easily push properties into your components to easily customize ...
- 从cmd中进入MySQL的命令界面
两种方式进入mysql命令界面 第一.直接开始界面→搜索mysql客户端登陆界面 第二.从cmd中进入MySQL的命令界面 2010-05-17 10:02:05| 分类: mysql|字号 订阅 ...
- JavaScript实现回到顶部
HTML页面使用一个a标签,href内填写JavaScript:;以阻止默认行为,在学习实例的时候添加一个大的div来充实页面. demo: <a href="javascript:; ...