iOS 二維碼生成以及識別

PS: 一直忙著解決提審上線問題,終于下下來精心整理下以前寫的東西了,最近蘋果審核槽點太多. 感覺不愛了.

import AVFoundation

//MARK: -二維碼圖片生成以及識別

extension QRCodeTool{

//MARK: -生成二維碼圖片

? ? @objc class func encodeQrString(_ infoDic:[String:Any])->CIImage{

????????? //infoDicNew 為二維碼內需要包含的信息

? ? ? ? // 1.創(chuàng)建過濾器,這里的@"CIQRCodeGenerator"是固定的

? ? ? ? let filter = CIFilter.init(name: "CIQRCodeGenerator")

? ? ? ? // 2.恢復默認設置

? ? ? ? filter?.setDefaults()

? ? ? ? // 3. 給過濾器添加數據

? ? ? ? var infoJsonStr = infoDic轉成的jsonstring

? ? ? ? var charset = CharacterSet.urlHostAllowed

? ? ? ? charset.remove(charactersIn: "+")

? ? ? ? charset.remove(charactersIn: "=")


let urlPrefix = "Associated Domains" 或者 app 的 scheme://?

//按需要拼接,如果項目配置了通用鏈接(Universal

Links)的話,可以讓server配置個默認落地頁,直接二維碼識別出url可以跳轉到落地頁展示app或者直接跳轉到你的app,關于通用鏈接的說明我就不寫了,別人寫的挺好的.可參照http://www.cocoachina.com/ios/20150902/13321.html

??????? let urlSuffix = infoJsonStr(infoJsonStr 可做加密)

? ? ? ? let urlStr =?urlPrefix + urlSuffix

? ? ? ? let qrcodeData = urlStr.data(using: String.Encoding.utf8)

? ? ? ? filter?.setValue(qrcodeData, forKey: "inputMessage")

? ? ? ? // 4. 生成二維碼圖片

? ? ? ? return filter!.outputImage!

? ? }

//MARK: -識別圖片 成功結果為空時表明識別失敗

? ? class func scan(img:UIImage?)->String?{

? ? ? ? if img == nil{

???????????? //二維碼圖片為空

? ? ? ? ? ? return nil;

? ? ? ? }


? ? ? let detector = CIDetector.init(ofType: CIDetectorTypeQRCode,

context: nil, options: [CIDetectorAccuracy:CIDetectorAccuracyHigh])

? ? ? ? // 識別二維碼取得識別結果

??????? //先識別原圖片

? ? ? ? var features = detector?.features(in: CIImage.init(cgImage: img!.cgImage!))

? ? ? ? //messageString

? ? ? ? var resultStr:String?

? ? ? ? if (features?.count ?? 0) == 0{

??????????? //識別失敗,放大的二維碼圖片并識別

??????????? let image = screenSizeImage(with: img!)

? ? ? ? ? ? features = detector?.features(in:? CIImage.init(cgImage:image!.cgImage!))

? ? ? ? ? ? if (features?.count ?? 0) > 0{

? ? ? ? ? ? ? ? if let feature = features![0] as? CIQRCodeFeature{

? ? ? ? ? ? ? ? ? ? resultStr = feature.messageString

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? } else {

? ? ? ? ? ? for feature in features!{

? ? ? ? ? ? ? ? if feature.type == CIFeatureTypeQRCode {

? ? ? ? ? ? ? ? ? ? resultStr = (feature as? CIQRCodeFeature)?.messageString

? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? }

?????? return? resultStr

}

// 放大二維碼圖片

class? func screenSizeImage(with image:UIImage)->UIImage{

?????????? let imageWidth = image.size.width

?????????? let imageHeight = image.size.height

????????? if (imageWidth <= kScreenWidth && imageHeight <= kScreenHeight) {

???????????????? return image;

????????? }

???????? let maxWH = max(imageWidth, imageHeight)

???????? let scale = maxWH / (kScreenHeight * 2.0)

???????? let size = CGSize(width:imageWidth / scale, height: imageHeight / scale)

????????? UIGraphicsBeginImageContext(size);

????????? image.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))

????????? let newImage = UIGraphicsGetImageFromCurrentImageContext();

?????????? UIGraphicsEndImageContext();

?????????? return newImage ?? UIImage()

}


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容