Swift5以及IOS15对于二维码的使用
生活随笔
收集整理的這篇文章主要介紹了
Swift5以及IOS15对于二维码的使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Swift5以及IOS15對于二維碼的使用
info.plist 加入這句話,而且第三個功能必須在真機上運行,模擬機不行。
Privacy - Camera Usage Description
OC方式:
一,二維碼生成:
關鍵性代碼:
- (void)viewDidLoad {[super viewDidLoad];//self.qrImageView.image = [GeneratorQRCodeVC creatQRImage:@"123" withSize:200];UIImage *image1 = [GeneratorQRCodeVC creatQRImage:@"123" withSize:200];UIImage *center = [UIImage imageNamed:@"zhengshuang.jpeg"];image1 = [self getNewImage:image1 withCenter:center];self.qrImageView.image = image1; } +(UIImage *)creatQRImage:(NSString *)url withSize:(CGFloat)size{CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];[filter setDefaults];NSString *string = url;NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];[filter setValue:data forKeyPath:@"inputMessage"];CIImage *img= [filter outputImage];return [self setQRImage:img withSize:size]; } +(UIImage *)setQRImage:(CIImage *)image withSize:(CGFloat)size{CGRect extent = CGRectIntegral(image.extent);CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));size_t width = CGRectGetWidth(extent) * scale;size_t height = CGRectGetHeight(extent) * scale;CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);CIContext *context = [CIContext contextWithOptions:nil];CGImageRef bitmapImage = [context createCGImage:image fromRect:extent];CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);CGContextScaleCTM(bitmapRef, scale, scale);CGContextDrawImage(bitmapRef, extent, bitmapImage);CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);CGContextRelease(bitmapRef);CGImageRelease(bitmapImage);return [UIImage imageWithCGImage:scaledImage]; } -(UIImage *)getNewImage:(UIImage *)sourceImage withCenter:(UIImage *)center{CGSize size = sourceImage.size;UIGraphicsBeginImageContext(sourceImage.size);[sourceImage drawInRect:CGRectMake(0, 0, size.width, size.height)];CGFloat width = 40,height = 40;CGFloat x = (size.width - width) / 2;CGFloat y = (size.height - height) / 2;[center drawInRect:CGRectMake(x, y, width, height)];UIImage *resultImgae = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();return resultImgae; } @end利用圖形上下文,繪制了一個小圖在圖片內部,
二,二維碼識別:
- (IBAction)shiBie:(id)sender {UIImage *image = self.sourceImageView.image;CIImage *imageCI = [[CIImage alloc] initWithImage:image];//開始識別//創建一個二維碼探測器CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy:CIDetectorAccuracyHigh}];//直接探測二維碼特征NSString *strMSg = nil;NSArray<CIFeature *> *features = [detector featuresInImage:imageCI];for (CIFeature *feature in features) {CIQRCodeFeature *qrFeatrue = (CIQRCodeFeature *)feature;NSLog(@"%@",qrFeatrue.messageString);strMSg = qrFeatrue.messageString;}UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"結果" message:strMSg preferredStyle:UIAlertControllerStyleAlert];[self presentViewController:alert animated:YES completion:nil];dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3*NSEC_PER_SEC)), dispatch_get_main_queue(), ^{[alert dismissViewControllerAnimated:YES completion:nil];}); }我這里識別的是單一的圖片??梢宰R別多張圖片。
三,掃描二維碼:
掃描是最難的,最麻煩的。
swift方式:
一。二維碼的生成
override func viewDidLoad() {let str = inputTextView.text ?? ""super.viewDidLoad()self.title = "二維碼生成";let filter = CIFilter(name: "CIQRCodeGenerator")filter?.setDefaults()let data = str.data(using: String.Encoding.utf8)filter?.setValue(data, forKey: "inputMessage")filter?.setValue("H", forKey: "inputCorrectionLevel")var image = filter?.outputImagelet transform = CGAffineTransform(scaleX: 20, y: 20)image = image?.transformed(by: transform)var resultImage = UIImage(ciImage: image!)let center = UIImage(named: "zhengshuang.jpeg")!resultImage = getNewImage(sourceImage: resultImage, center: center)qrCodeImageView.image = resultImage}func getNewImage(sourceImage: UIImage,center: UIImage) -> UIImage {let size = sourceImage.sizeUIGraphicsBeginImageContext(size)sourceImage.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))let width: CGFloat = 80let height: CGFloat = 80let x: CGFloat = (size.width - width) * 0.5let y: CGFloat = (size.height - height) * 0.5center.draw(in: CGRect(x: x, y: y, width: width, height: height))let resultImage = UIGraphicsGetImageFromCurrentImageContext()!UIGraphicsEndImageContext()return resultImage}二,二維碼的識別
let image = sourceImageView.imagelet imageCI = CIImage(image: image!)//開始識別//創建一個二維碼探測器let dector = CIDetector(ofType: CIDetectorTypeQRCode, context: nil, options: [CIDetectorAccuracy: CIDetectorAccuracyHigh])//直接探測二維碼特征let features = dector?.features(in: imageCI!)var resultImage = imagevar strMsg: String?var strMsgArr = [String]()for feature in features! { // debugPrint(feature)let qrFeature = feature as! CIQRCodeFeaturedebugPrint(qrFeature.messageString)strMsgArr.append(qrFeature.messageString!) // debugPrint(qrFeature.bounds)resultImage = drawFrame(image: resultImage!, feature: qrFeature)sourceImageView.image = resultImagestrMsg = qrFeature.messageString}debugPrint(strMsg?.count)let al = UIAlertController(title: "結果", message: strMsgArr.description, preferredStyle: .alert)let action = UIAlertAction(title: "關閉", style: .cancel, handler: nil)self .present(al, animated: true, completion: nil)al.addAction(action) func drawFrame(image:UIImage,feature: CIQRCodeFeature) ->UIImage {let size = image.sizeUIGraphicsBeginImageContext(size)image.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))//轉換坐標系 (上下顛倒)開始let context = UIGraphicsGetCurrentContext()!context.scaleBy(x: 1, y: -1)context.translateBy(x: 0, y: -size.height) // CGContextScaleCTM(context,1,-1) 函數過期 // CGContextTranslateCTM(context,0,-size.height) 函數過期//轉換坐標系 (上下顛倒) 結束let bounds = feature.boundslet path = UIBezierPath(rect: bounds)path.lineWidth = 6UIColor.red.setStroke()path.stroke()let resultImage = UIGraphicsGetImageFromCurrentImageContext()UIGraphicsEndImageContext()return resultImage!}三,掃描二維碼
import UIKit import AVFoundation class ScanQRCodeVC: UIViewController {var session: AVCaptureSession?weak var layer: AVCaptureVideoPreviewLayer?@IBOutlet weak var chongjiBoView: UIImageView!@IBOutlet weak var scanBackVIew: UIView!@IBOutlet weak var toBottom: NSLayoutConstraint!override func viewDidLoad() {super.viewDidLoad()title = "掃描二維碼"}func startScan() -> Void{//1.獲取 攝像頭設備let device: AVCaptureDevice = AVCaptureDevice.default(for: .video)!var input: AVCaptureDeviceInput?do {input = try AVCaptureDeviceInput(device: device)}catch {debugPrint(error)return}//2.設置輸出let output = AVCaptureMetadataOutput()//2.1 設置結果處理的代理output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)//3.創建會話session = AVCaptureSession()if session!.canAddInput(input!) && session!.canAddOutput(output) {session!.addInput(input!)session!.addOutput(output)}else{return}//3.1 設置二維碼可以識別的碼制output.metadataObjectTypes = [AVMetadataObject.ObjectType.qr]let bounds = UIScreen.main.boundslet x: CGFloat = scanBackVIew.frame.origin.x / bounds.size.widthlet y: CGFloat = scanBackVIew.frame.origin.y / bounds.size.heightlet width: CGFloat = scanBackVIew.frame.size.width / bounds.size.widthlet height: CGFloat = scanBackVIew.frame.size.height / bounds.size.heightoutput.rectOfInterest = CGRect(x: y, y: x, width: height, height: width)let layer = AVCaptureVideoPreviewLayer(session: session!)layer.frame = UIScreen.main.boundsview.layer.insertSublayer(layer, at: 0)//4.啟動會話讓輸入開始菜單數據 輸出對象 開始處理數據session!.startRunning()self.layer = layer}override func viewDidAppear(_ animated: Bool) {super.viewDidAppear(animated)toBottom.constant = scanBackVIew.frame.size.heightview.layoutIfNeeded()toBottom.constant = -scanBackVIew.frame.size.heightUIView.animate(withDuration: 2) {UIView.setAnimationRepeatCount(MAXFLOAT)self.view.layoutIfNeeded()}}override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {startScan()}func removeScanAnim(){chongjiBoView.layer.removeAllAnimations()}}extension ScanQRCodeVC : AVCaptureMetadataOutputObjectsDelegate{func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection){ // debugPrint("set")debugPrint(metadataObjects)for obj in metadataObjects {if obj.isKind(of: AVMetadataMachineReadableCodeObject.self) {let resultObj = self.layer?.transformedMetadataObject(for: obj)let qrCodeObj = resultObj as! AVMetadataMachineReadableCodeObjectdebugPrint(qrCodeObj.stringValue!)debugPrint(qrCodeObj.corners) // qrCodeObj.corners 代表二維碼4個角 但是// drawFrame(qrCodeObj: qrCodeObj)}}}func drawFrame(qrCodeObj: AVMetadataMachineReadableCodeObject) -> Void {let corners = qrCodeObj.corners//1.借助一個圖形層let shapLayer = CAShapeLayer()let path = UIBezierPath()var index = 0;for corner in corners {let pointDic = corner as! CFDictionaryvar point = CGPoint.zero // CGPointMakeWithDictionaryRepresentation(pointDic, &point) // point = CGPoint.init(dictionaryRepresentation: pointDic)!point = CGPoint.init(dictionaryRepresentation: pointDic)!if index==0 {path.move(to: point)}else {path.addLine(to: point)}index += 1}shapLayer.path = path.cgPathlayer?.addSublayer(shapLayer)} }git地址
https://gitee.com/johnson__save_admin/qrcode-swift
總結
以上是生活随笔為你收集整理的Swift5以及IOS15对于二维码的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AFNetworking 4.x高版本上
- 下一篇: 你的代码(软件)安全吗?【信息图】