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 和 ...
随机推荐
- ZOJ2834--Maximize Game Time(树形DP)
写之前觉得很恶心,写完了觉得挺好玩了,1A,棒棒哒~ 题解全在代码注释中了,想清楚思路一路写下了果然没怎么卡 ^_^ /**************************************** ...
- 整理收藏一份PHP高级工程师的笔试题
整理了一份PHP高级工程师的笔试题,问题很全面.嗯,基本上这些题都答得不错,那么你应该可以胜任大部分互联网企业的PHP职位了.下面直接上题. 1. 基本知识点 HTTP协议中几个状态码的含义:503, ...
- 浅谈js单例模式
单例模式就是在系统中保存一个实例,就是一个全局变量,在团队开发中,为了实现一些相似的功能,比如不同页面之间的表单验证,可能需求是不一样的,但是呢命名可能一样,这时就会产生冲突,这时候单例模式就能很好的 ...
- 无法通过 128 (在表空间 TEMP 中) 扩展 temp 段
1.查看表空间中数据文件存储的路径以及是否可以自动扩展 SELECT TABLESPACE_NAME, BYTES/1024/1024 FILE_SIZE_MB, FILE_NAME FROM DBA ...
- 推送通知/传感器/UIDynamic仿真(推送通知已适配iOS10)
推送通知/传感器/UIDynamic 一.推送通知 1.推送通知简介 什么是推送通知 此处的推送通知与NSNotification没有任何关系 可以理解为,向用户推送一条信息来通知用户某件事情 作用: ...
- IOS开发之TableView替换默认的checkmark为自定义图像
直接上代码: On cellForRowAtIndexPath: UIButton*button =[UIButton buttonWithType:UIButtonTypeCustom];CGRec ...
- WINFORM 自定义开关按钮控件-
本文章转载:http://www.cnblogs.com/feiyangqingyun/archive/2013/06/15/3137597.html OK,大工告成,上图演示效果. 源码下载:htt ...
- Linux多线程的一个小例子
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h& ...
- 使用viewpager实现广告条轮询的效果
先上效果图: viewpager是google在v4-support包中提供的,使用时与listview类似,度需要提供一个adapter, 只不过viewpager提供的是PagerAdapter ...
- Java基础知识强化之IO流笔记58:内存操作流
1. 内存操作流: 用来操作处理临时存储的信息的. (1)操作字节数组: ByteArrayInputStream ByteArrayOutputStream 代码示例: package cn.itc ...