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 和 ...
随机推荐
- GridControl 复合表头(多行标题)
说明: 最好是通过编辑视图进行设计,后台编码有点麻烦. 例图:(上面的GC是后台编写 ,下面的是设计器设计) 后台代码编写: public void InitCtrl() { DevExpress.X ...
- 如何生成Dump文件
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:如何生成Dump文件.
- OcciWrapper使用指南(高性能Oracle访问组件)
occiwrapper使用指南 occiwrapper是一个开源的.跨平台的Oracle访问组件, 方便C++开发者们灵活地操作oracle数据库.为了方便使用,组件中的接口形式参考的POCO库的使用 ...
- 记RedisDesktopManager的一次崩溃
redis3.2的配置文件中有bind监听地址 bind 192.168.42.131默认bind的填写的127.0.0.1这样配置是只允许本地访问,如果想远程访问就改为本机网卡绑定的ip地址.我这边 ...
- 【42】了解typename的双重意义
1.在template声明中,class与typename是等价的,但是使用typename更好. 2.在template实现中,模版形参是从属名称,嵌套在模版形参中的类型是嵌套从属名称,不依赖任何t ...
- jQuery获取Select选中的Text和Value,根据Value值动态添加属性
语法解释:1. $("#select_id").change(function(){//code...}); //为Select添加事件,当选择其中一项时触发2. var chec ...
- android学习二(Activity)
前面我简单的介绍了android的一些基础知识,当作热身吧,接下来接触android的四大组件的activity活动. 1.活动Activity是是一种保护用户界面的组件,主要用于和用户进行交互. 活 ...
- [Javascript] Use Number() to convert to Number if possilbe
Use map() and Number() to convert to number if possilbe or NaN. var str = ["1","1.23& ...
- 多态VI的创建
比较适合使用多态VI的场合:一个算法会应用到几种不同的数据类型上.比如读写 INI 文件的 VI,它 们既可以读写数值型的数据,也可以读写字符串.布尔等数据类型. 实现多态 VI 之前,一般先实现它的 ...
- MyEclipse的快捷键的使用
MyEclipse的10个快捷键:Ctrl + Shift + T: 打开类型:显示"打开类型"对话框来在编辑器中打开类型."打开类型"选择对话框显示工作空间中 ...