在网上找了找扫描二维码的例子,利用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 扫描二维码的更多相关文章

  1. windows rt 扫描二维码

    项目中使用的是ZXing.net,应用商店程序.使用到的dll是ZXing.winmd. 大致思路为,使用MediaCapture捕获图片.获取到CapturePhotoToStreamAsync流, ...

  2. Ionic2学习笔记(10):扫描二维码

    作者:Grey 原文地址: http://www.cnblogs.com/greyzeng/p/5575843.html 时间:6/11/2016     说明: 在本文发表的时候(2016-06-1 ...

  3. 实现手机扫描二维码页面登录,类似web微信-第一篇,业务分析

    转自:http://www.cnblogs.com/fengyun99/p/3541249.html 关于XMPP组件的文章,先休息两天,好歹已经完整的写了一份. 这两天,先实现一套关于web微信扫描 ...

  4. windows phone 生产二维码和解码本地二维码图片

    前面模仿着写了一个手机扫描二维码和条形码的例子,zxing(下载)的Silverlight库实现的,当时还纳闷有windows phone的库为什么不用,其实都是一样的,,,要改的就是获取摄像头获取的 ...

  5. [置顶] xamarin android使用zxing扫描二维码

    好久没写了,这片文章篇幅不长,概述一下在xamarin android中用 ZXing.Net.Mobile库扫描二维码读取url的示例.扫码支付,扫码登录,App上各种各样的扫码,好像没个扫码的就有 ...

  6. .net实现扫描二维码登录webqq群抓取qq群信息

    一.流程 1. //获得二维码的qrsig,cookie标志 2. //登录二维码获得二维码的状态,及最新的url 3. //登录此网址,获得Cookies 4.//cookies,筛选出skey信息 ...

  7. SNF开发平台WinForm-平板拍照及扫描二维码功能

    在我们做项目的时候,经常会有移动平板处理检验,审核等,方便移动办公.这时就需要在现场拍照上传问题,把当场问题进行上传,也有已经拍完照的图片或加工过的图片进行上传.还有在车间现场一体机,工控机 这种产物 ...

  8. iOS使用Zbar扫描二维码

    iOS使用Zbar扫描二维码 标签(空格分隔):二维码扫描 iOS Zbar64位 正文: 首先下载一个支持64位系统的ZbarSDK的包,保存在了我的云盘里,地址:ZbarSDK 把文件拖到工程里面 ...

  9. 制作IOS企业版App网页扫描二维码下载安装

    有时候我们需要在XX网站的主页上去扫描二维码下载,那么ios开发中如何做到这一点呢. 我给大家解答一下,这也是在最近工作中用到的部分,在网上了解了一些. 下面给大家分解一下步骤: 1.Plist 和 ...

随机推荐

  1. Polya定理

    http://www.cnblogs.com/wenruo/p/5304698.html 先看 Polya定理,Burnside引理回忆一下基础知识.总结的很棒. 一个置换就是集合到自身的一个双射,置 ...

  2. opencv基础知识-videowriter

    一.前言-简介 在试验中需要常常将实验结果进行保存,在opencv中提供很好用的录制视频的句柄,也可称之为类-videowriter. videowriter应用那是相当的简单,总之分为三步: //声 ...

  3. 在.net Core 中像以前那样的使用HttpContext.Current

    今晚在学习.net Core 的使用 拿来以前项目进行改造最简单的问题就是怎么做到让httpcontext 和以前兼容 ,折腾的很久 终于搞定,纪录一下 .net core中使用了无处不在的注入,看了 ...

  4. Windows性能计数器--磁盘性能分析Disk

    Physical Disk: 单次IO大小 Avg.Disk Bytes/Read Avg.Disk Bytes/Write IO响应时间 Avg.Disk sec/Read Avg.Disk sec ...

  5. 2014上海全国邀请赛题解 HDOJ 5090-5099

    HDOJ 5090 水题.从小到大排序,能够填充达到符合条件的.先填充好.填充之后进行调整. 传送门:pid=5090">点击打开链接 #include <cstdio> ...

  6. Emmet最全提示说明

    前一篇文章简单了说明了Emmet的使用:Emmet相关使用 今天我就将关于subline中Emmet插件的snippets.json文件进行具体说明, 在snippets.json文档中,我们能够看到 ...

  7. (二)Java对象与内存控制

    一.java的类变量和实例变量: java中的变量可分成两种:成员变量和局部变量. 1.局部变量包括以下几类: 方法内的局部变量:作用域为方法体. 代码块内的局部变量:作用域为代码块 形参:方法内的形 ...

  8. 使用phpize建立php扩展(Cannot find config.m4)(转)

    php源码:/root/soft/php-5.3.4php安装: /usr/local/php [root@ns root]# phpizeCannot find config.m4.Make sur ...

  9. java07 map

    map底层,数组加链表 集合: 是一个对象,只不过这个对象可以容纳别的对象.存放对象就是操作地址. List:是有序可重复的. Set:无顺序,不可重复,有重复则后面把前面的覆盖. Map:键值对. ...

  10. Java基础知识强化之IO流笔记48:IO流练习之 复制单级文件夹案例

    1. 复制单级文件夹     数据源:e:\\demo     目的地:e:\\test 分析: A:封装目录 B:获取该目录下的所有文本的File数组 C:遍历该File数组,得到每一个File对象 ...