关于iOS的二维码生成和解析

关于iOS的二维码生成和解析

在现在的应用App中多多少少都会遇到一个功能,扫描二维码,其实扫出来的就是一个字符串,大家有兴趣可以对一些微信的二维码进行test,写个test project然后将扫描出来的结果用弹窗的形式直观地显示出来。
最近在做的个小东西就包括了扫码,并且需要将一个字符串转成一个UIImage的对象,查找了下网上大神们的blog再看了下Apple的官方文档,其实还算简单。上代码吧:

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
class QRCodeUtil: NSObject {
/**
识别二维码,返回字符串
- parameter image: 二维码图像
- returns: 二维码字符
*/
static func recognizeQRImage(image: UIImage) -> String{
var temp: Int32 = 1
let orientation = image.imageOrientation
let detector: CIDetector = CIDetector(ofType: CIDetectorTypeQRCode, context: nil, options: [CIDetectorAccuracy:CIDetectorAccuracyHigh])
switch orientation{
case .Up:
temp = 1
break
case .Down:
temp = 3
break
case .Left:
temp = 8
break
case .Right:
temp = 6
break
case .UpMirrored:
temp = 2
break
case .DownMirrored:
temp = 4
break
case .LeftMirrored:
temp = 5
break
case .RightMirrored:
temp = 7
break
}
let img = CIImage(CGImage: image.CGImage!, options: [CIDetectorImageOrientation: NSNumber(int: temp)])
let features: [CIFeature]? = detector.featuresInImage(img, options: [CIDetectorAccuracy: CIDetectorAccuracyHigh, CIDetectorImageOrientation: NSNumber(int: temp)])
if( features != nil && features?.count > 0)
{
let feature = features![0]
if feature.isKindOfClass(CIQRCodeFeature)
{
let featureTmp:CIQRCodeFeature = feature as! CIQRCodeFeature
let scanResult = featureTmp.messageString
return scanResult
}
}
return ""
}
/**
生成二维码
- parameter codeType: code类型
- parameter codeString: 字符串
- parameter size: 大小
- parameter qrColor: 二维码的颜色
- parameter bkColor: 二维码的背景颜色
- returns: 图像UIImage
*/
static func createCode(codeType: String, codeString: String, size: CGSize, qrColor: UIColor, bkColor: UIColor )->UIImage?
{
let stringData = codeString.dataUsingEncoding(NSUTF8StringEncoding)
//系统自带能生成的码
// CIAztecCodeGenerator
// CICode128BarcodeGenerator
// CIPDF417BarcodeGenerator
// CIQRCodeGenerator
let qrFilter = CIFilter(name: codeType)
qrFilter?.setValue(stringData, forKey: "inputMessage")
qrFilter?.setValue("H", forKey: "inputCorrectionLevel")
//上色
let colorFilter = CIFilter(name: "CIFalseColor", withInputParameters: ["inputImage":qrFilter!.outputImage!,"inputColor0":CIColor(CGColor: qrColor.CGColor), "inputColor1": CIColor(CGColor: bkColor.CGColor)])
let qrImage = colorFilter!.outputImage;
//绘制
let cgImage = CIContext().createCGImage(qrImage!, fromRect: qrImage!.extent)
UIGraphicsBeginImageContext(size);
let context = UIGraphicsGetCurrentContext();
CGContextSetInterpolationQuality(context, CGInterpolationQuality.None);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawImage(context, CGContextGetClipBoundingBox(context), cgImage);
let codeImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return codeImage
}
}

使用的时候也很方便,在此就不再赘述了~记录一下代码,enjoy it~!