1,直接读取图片中的二维码

使用 CIDetector可以很方便的检测并读取二维码。下面是一个从 UIImage中读取二维码的样例,我们要把图片上所有的二维码信息都打印出来。


代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import UIKit
class ViewController : UIViewController {
override func viewDidLoad() {
super .viewDidLoad()
let qrcodeImg = UIImage (named: "codeBg.png" )
ciImage: CIImage = CIImage (image:qrcodeImg!)!
context = CIContext (options: nil )
detector: CIDetector (ofType: CIDetectorTypeQRCode ,
context: context,options: [ CIDetectorAccuracy CIDetectorAccuracyHigh ])
features=detector.featuresInImage(ciImage)
print ( "扫描到二维码个数:\(features.count)" )
//遍历所有的二维码,并框出
for feature in features as ! [ CiqrCodeFeature ] {
(feature.messageString)
}
}
didReceiveMemoryWarning() {
.didReceiveMemoryWarning()
}
}
控制台输出如下:
扫描到二维码个数:2
http://www.hangge.com
http://www.hangge.com
可以看到两个二维码都成功的读取到了。

(注:这个我原来用模拟器一直检测不到二维码,使用真机调试就没问题。 感谢网友“落叶”的提醒,模拟器选iphone5s及以上设备也是可以检测到的。

2,从相册中选择图片读取二维码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import UIKit
class ViewController : UIViewController ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.5em!important; margin:0px!important; overflow:visible!important; padding:1px 0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas, UIImagePickerControllerDelegate ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.5em!important; margin:0px!important; overflow:visible!important; padding:1px 0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
UINavigationControllerDelegate {
override func viewDidLoad() {
super .viewDidLoad()
}
//选取相册
@IBAction fromAlbum(sender: AnyObject ) {
//判断设置是否支持图片库
if UIImagePickerController .isSourceTypeAvailable(. PhotoLibrary ){
//初始化图片控制器
let picker = UIImagePickerController ()
//设置代理
picker.delegate = self
//指定图片控制器类型
picker.sourceType = UIImagePickerControllerSourceType . PhotoLibrary
//弹出控制器,显示界面
self .presentViewController(picker,animated: true ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.5em!important; margin:0px!important; overflow:visible!important; padding:1px 0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,completion: {
() -> Void in
})
} else {
print ( "读取相册错误" )
}
}
//选择图片成功后代理
imagePickerController(picker: ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.5em!important; margin:0px!important; overflow:visible!important; padding:1px 0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
didFinishPickingMediawithInfo info: [ String : ]) {
//获取选择的原图
image = info[ UIImagePickerControllerOriginalImage ] as ! UIImage
//二维码读取
ciImage: CIImage = CIImage (image:image)!
context = CIContext (options: nil )
detector: CIDetector (ofType: CIDetectorTypeQRCode ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.5em!important; margin:0px!important; overflow:visible!important; padding:1px 0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.5em!important; margin:0px!important; overflow:visible!important; padding:0px 1em!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important; background:none rgb(249,options: [ CIDetectorAccuracy CIDetectorAccuracyHigh ])
features=detector.featuresInImage(ciImage)
"扫描到二维码个数:\(features.count)" )
//遍历所有的二维码,并框出
for feature in features ! [ CiqrCodeFeature ] {
(feature.messageString)
}
//图片控制器退出
picker.dismissViewControllerAnimated( ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.5em!important; margin:0px!important; overflow:visible!important; padding:1px 0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,completion: {
() -> Void in
})
}
didReceiveMemoryWarning() {
.didReceiveMemoryWarning()
}
}

3,使用摄像头扫描读取二维码
(1)扫描主要使用的是 AVFoundation,用起来方便简单
(2)通过 AVCaptureMetadataOutputrectOfInterest属性,可以设置探测探测区域。同时给这个探测区域添加个方框,只有在框中的二维码才会被扫描到。

效果图如下:

代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import UIKit
AVFoundation
class ViewController : UIViewController ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.5em!important; margin:0px!important; overflow:visible!important; padding:1px 0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas, AVCaptureMetadataOutputObjectsDelegate ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.5em!important; margin:0px!important; overflow:visible!important; padding:1px 0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
UIAlertViewDelegate {
var scanRectView: UIView !
device: AVCaptureDevice !
input: AVCaptureDeviceInput !
output: AVCaptureMetadataOutput !
session: AVCaptureSession !
preview: AVCaptureVideoPreviewLayer !
override func viewDidLoad() {
super .viewDidLoad()
}
//通过摄像头扫描
@IBAction fromCamera(sender: AnyObject ) {
do{
self .device = AVCaptureDevice .defaultDeviceWithMediaType( AVMediaTypeVideo )
.input = try (device: device)
.output = AVCaptureMetadataOutput ()
output.setMetadataObjectsDelegate( ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.5em!important; margin:0px!important; overflow:visible!important; padding:1px 0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,queue: dispatch_get_main_queue())
.session = ()
if UIScreen .mainScreen().bounds.size.height<500 {
.session.sessionPreset = AVCaptureSessionPreset640x480
} else {
AVCaptureSessionPresetHigh
}
.session.addInput( .input)
.session.addOutput( .output)
.output.MetadataObjectTypes = [ AVMetadataObjectTypeQRCode ]
//计算中间可探测区域
let windowSize: CGSize = .mainScreen().bounds.size;
scanSize: CGSizeMake (windowSize.width*3/4,
windowSize.width*3/4);
scanRect: CGRect = CGRectMake ((windowSize.width-scanSize.width)/2,
(windowSize.height-scanSize.height)/2,scanSize.width,scanSize.height);
//计算rectOfInterest 注意x,y交换位置
scanRect = (scanRect.origin.y/windowSize.height,
scanRect.origin.x/windowSize.width,
scanRect.size.height/windowSize.height,
scanRect.size.width/windowSize.width);
//设置可探测区域
.output.rectOfInterest = scanRect
.preview = AVCaptureVideoPreviewLayer (session: .session)
.preview.videoGravity = AVLayerVideoGravityResizeAspectFill
.preview.frame = .mainScreen().bounds
.view.layer.insertSublayer( .preview,atIndex:0)
//添加中间的探测区域绿框
.scanRectView = UIView ();
.view.addSubview( .scanRectView)
.scanRectView.frame = CGRectMake (0,scanSize.height);
.scanRectView.center = CGPointMake (
CGRectGetMidX ( UIScreen .mainScreen().bounds),
CGRectGetMidY .mainScreen().bounds));
.scanRectView.layer.borderColor = UIColor .greenColor(). CGColor
.scanRectView.layer.borderWidth = 1;
//开始捕获
.session.startRunning()
}catch _ as NSError {
//打印错误消息
errorAlert = UIAlertView (title: "提醒" ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.5em!important; margin:0px!important; overflow:visible!important; padding:1px 0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
message: "请在iPhone的\"设置-隐私-相机\"选项中,允许本程序访问您的相机" ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.5em!important; margin:0px!important; overflow:visible!important; padding:1px 0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
delegate: ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.5em!important; margin:0px!important; overflow:visible!important; padding:1px 0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
cancelButtonTitle: "确定" )
errorAlert.show()
}
}
//摄像头捕获
captureOutput(captureOutput: AVCaptureOutput !,
didOutputMetadataObjects MetadataObjects: [ AnyObject ]!,
fromConnection connection: AVCaptureConnection !) {
stringValue: String ?
if MetadataObjects.count > 0 {
MetadataObject = MetadataObjects[0] as ! AVMetadataMachineReadableCodeObject
stringValue = MetadataObject.stringValue
stringValue != nil {
.session.stopRunning()
}
}
.session.stopRunning()
//输出结果
alertView = UIAlertView "二维码" ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.5em!important; margin:0px!important; overflow:visible!important; padding:1px 0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,message: stringValue,
ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.5em!important; margin:0px!important; overflow:visible!important; padding:0px 1em!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; min-height:auto!important; background:none rgb(249,cancelButtonTitle: )
alertView.show()
}
//消息框确认后消失
alertView(alertView: ottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.5em!important; margin:0px!important; overflow:visible!important; padding:1px 0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,willdismissWithButtonIndex buttonIndex: Int ) {
//继续扫描
.session.startRunning()
}
didReceiveMemoryWarning() {
.didReceiveMemoryWarning()
}
}

原文出自: www.hangge.com 转载请保留原文链接: http://www.hangge.com/blog/cache/detail_915.html

Swift - 二维码QRCode的读取的更多相关文章

  1. 用canvas做一个DVD待机动画的实现代码

    这篇文章主要介绍了用canvas做一个DVD待机动画的实现代码的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  2. 使用Html5多媒体实现微信语音功能

    这篇文章主要介绍了使用Html5多媒体实现微信语音功能,需要的朋友可以参考下

  3. HTML5自定义视频播放器源码

    这篇文章主要介绍了HTML5自定义视频播放器源码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  4. Html5 滚动穿透的方法

    这篇文章主要介绍了Html5 滚动穿透的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  5. HTML5自定义mp3播放器源码

    这篇文章主要介绍了HTML5自定义mp3播放器源码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  6. 详解HTML5中CSS外观属性

    这篇文章主要介绍了HTML5中CSS外观属性的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,,需要的朋友可以参考下

  7. 手对手的教你用canvas画一个简单的海报的方法示例

    企业的广告投入开始从电视等传统媒体向基于圈层文化的新媒体精准营销转移,很多人都想制作一张属于自己的海报,本文介绍了手对手的教你用canvas画一个简单的海报的方法示例,感兴趣的可以了解一下

  8. CSS中实现动画效果-附案例

    这篇文章主要介绍了 CSS中实现动画效果并附上案例代码及实现效果,就是CSS动画样式处理,动画声明需要使用@keyframes name,后面的name是人为定义的动画名称,下面我们来看看文章的具体实现内容吧,需要的小伙伴可以参考一下

  9. html5默认气泡修改的代码详解

    这篇文章主要介绍了html5默认气泡修改的代码详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  10. 基于Html5 canvas实现裁剪图片和马赛克功能及又拍云上传图片 功能

    这篇文章主要介绍了基于Html5 canvas实现裁剪图片和马赛克功能及又拍云上传图片 功能,需要的朋友可以参考下

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部