From 7b02207537d35bfa1714bf8beafc921f717d100a Mon Sep 17 00:00:00 2001 From: 单军华 Date: Wed, 11 Jul 2018 10:47:42 +0800 Subject: [PATCH] 首次上传 --- screendisplay/Pods/HMQRCodeScanner/HMQRCodeScanner/QRCode/HMScanner.m | 312 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 312 insertions(+), 0 deletions(-) diff --git a/screendisplay/Pods/HMQRCodeScanner/HMQRCodeScanner/QRCode/HMScanner.m b/screendisplay/Pods/HMQRCodeScanner/HMQRCodeScanner/QRCode/HMScanner.m new file mode 100755 index 0000000..0c5dcfd --- /dev/null +++ b/screendisplay/Pods/HMQRCodeScanner/HMQRCodeScanner/QRCode/HMScanner.m @@ -0,0 +1,312 @@ +// +// HMScanner.m +// HMQRCodeScanner +// +// Created by ������ on 16/1/2. +// Copyright �� 2016��� itheima. All rights reserved. +// + +#import "HMScanner.h" +#import <AVFoundation/AVFoundation.h> + +/// ������������������ +#define kMaxDetectedCount 20 + +@interface HMScanner() <AVCaptureMetadataOutputObjectsDelegate> +/// ������������������ +@property (nonatomic, weak) UIView *parentView; +/// ������������ +@property (nonatomic) CGRect scanFrame; +/// ������������ +@property (nonatomic, copy) void (^completionCallBack)(NSString *); +@end + +@implementation HMScanner { + /// ������������ + AVCaptureSession *session; + /// ������������ + AVCaptureVideoPreviewLayer *previewLayer; + /// ������������ + CALayer *drawLayer; + /// ������������������ + NSInteger currentDetectedCount; +} + +#pragma mark - ��������������� ++ (void)qrImageWithString:(NSString *)string avatar:(UIImage *)avatar completion:(void (^)(UIImage *))completion { + [self qrImageWithString:string avatar:avatar scale:0.20 completion:completion]; +} + ++ (void)qrImageWithString:(NSString *)string avatar:(UIImage *)avatar scale:(CGFloat)scale completion:(void (^)(UIImage *))completion { + + NSAssert(completion != nil, @"������������������������"); + + dispatch_async(dispatch_get_global_queue(0, 0), ^{ + + CIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; + + [qrFilter setDefaults]; + [qrFilter setValue:[string dataUsingEncoding:NSUTF8StringEncoding] forKey:@"inputMessage"]; + + CIImage *ciImage = qrFilter.outputImage; + + CGAffineTransform transform = CGAffineTransformMakeScale(10, 10); + CIImage *transformedImage = [ciImage imageByApplyingTransform:transform]; + + CIContext *context = [CIContext contextWithOptions:nil]; + CGImageRef cgImage = [context createCGImage:transformedImage fromRect:transformedImage.extent]; + UIImage *qrImage = [UIImage imageWithCGImage:cgImage scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]; + CGImageRelease(cgImage); + + if (avatar != nil) { + qrImage = [self qrcodeImage:qrImage addAvatar:avatar scale:scale]; + } + + dispatch_async(dispatch_get_main_queue(), ^{ completion(qrImage); }); + }); +} + ++ (UIImage *)qrcodeImage:(UIImage *)qrImage addAvatar:(UIImage *)avatar scale:(CGFloat)scale { + + CGFloat screenScale = [UIScreen mainScreen].scale; + CGRect rect = CGRectMake(0, 0, qrImage.size.width * screenScale, qrImage.size.height * screenScale); + + UIGraphicsBeginImageContextWithOptions(rect.size, YES, screenScale); + + [qrImage drawInRect:rect]; + + CGSize avatarSize = CGSizeMake(rect.size.width * scale, rect.size.height * scale); + CGFloat x = (rect.size.width - avatarSize.width) * 0.5; + CGFloat y = (rect.size.height - avatarSize.height) * 0.5; + [avatar drawInRect:CGRectMake(x, y, avatarSize.width, avatarSize.height)]; + + UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); + + UIGraphicsEndImageContext(); + + return [UIImage imageWithCGImage:result.CGImage scale:screenScale orientation:UIImageOrientationUp]; +} + +#pragma mark - ������������������ ++ (void)scaneImage:(UIImage *)image completion:(void (^)(NSArray *))completion { + + NSAssert(completion != nil, @"������������������������"); + + dispatch_async(dispatch_get_global_queue(0, 0), ^{ + + CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy: CIDetectorAccuracyHigh}]; + + CIImage *ciImage = [[CIImage alloc] initWithImage:image]; + + NSArray *features = [detector featuresInImage:ciImage]; + + NSMutableArray *arrayM = [NSMutableArray arrayWithCapacity:features.count]; + for (CIQRCodeFeature *feature in features) { + [arrayM addObject:feature.messageString]; + } + + dispatch_async(dispatch_get_main_queue(), ^{ + completion(arrayM.copy); + }); + }); +} + +#pragma mark - ������������ ++ (instancetype)scanerWithView:(UIView *)view scanFrame:(CGRect)scanFrame completion:(void (^)(NSString *))completion { + NSAssert(completion != nil, @"������������������������"); + + return [[self alloc] initWithView:view scanFrame:scanFrame completion:completion]; +} + +- (instancetype)initWithView:(UIView *)view scanFrame:(CGRect)scanFrame completion:(void (^)(NSString *))completion { + self = [super init]; + + if (self) { + self.parentView = view; + self.scanFrame = scanFrame; + self.completionCallBack = completion; + + [self setupSession]; + } + return self; +} + +#pragma mark - ������������ +/// ������������ +- (void)startScan { + if ([session isRunning]) { + return; + } + currentDetectedCount = 0; + + [session startRunning]; +} + +- (void)stopScan { + if (![session isRunning]) { + return; + } + [session stopRunning]; +} + +#pragma mark - AVCaptureMetadataOutputObjectsDelegate +- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection { + + [self clearDrawLayer]; + + for (id obj in metadataObjects) { + // ������������������������������ + if (![obj isKindOfClass:[AVMetadataMachineReadableCodeObject class]]) { + return; + } + + // ������������������ + AVMetadataMachineReadableCodeObject *dataObject = (AVMetadataMachineReadableCodeObject *)[previewLayer transformedMetadataObjectForMetadataObject:obj]; + + // ������������������ + if (!CGRectContainsRect(self.scanFrame, dataObject.bounds)) { + continue; + } + + if (currentDetectedCount++ < kMaxDetectedCount) { + // ������������ + [self drawCornersShape:dataObject]; + } else { + [self stopScan]; + + // ������������ + if (self.completionCallBack != nil) { + self.completionCallBack(dataObject.stringValue); + } + } + } +} + +/// ������������������ +- (void)clearDrawLayer { + if (drawLayer.sublayers.count == 0) { + return; + } + + [drawLayer.sublayers makeObjectsPerformSelector:@selector(removeFromSuperlayer)]; +} + +/// ������������������ +/// +/// @param dataObject ������������������������ +- (void)drawCornersShape:(AVMetadataMachineReadableCodeObject *)dataObject { + + if (dataObject.corners.count == 0) { + return; + } + + CAShapeLayer *layer = [CAShapeLayer layer]; + + layer.lineWidth = 4; + layer.strokeColor = [UIColor greenColor].CGColor; + layer.fillColor = [UIColor clearColor].CGColor; + layer.path = [self cornersPath:dataObject.corners]; + + [drawLayer addSublayer:layer]; +} + +/// ������ corners ������������������������ +/// +/// @param corners corners ������ +/// +/// @return ������������ +- (CGPathRef)cornersPath:(NSArray *)corners { + + UIBezierPath *path = [UIBezierPath bezierPath]; + CGPoint point = CGPointZero; + + // 1. ��������������������� + NSInteger index = 0; + CGPointMakeWithDictionaryRepresentation((CFDictionaryRef)corners[index++], &point); + [path moveToPoint:point]; + + // 2. ������������������ + while (index < corners.count) { + CGPointMakeWithDictionaryRepresentation((CFDictionaryRef)corners[index++], &point); + [path addLineToPoint:point]; + } + + // 3. ������������ + [path closePath]; + + return path.CGPath; +} + +#pragma mark - ������������������ +/// ��������������������������������� +- (void)setupLayers { + + if (self.parentView == nil) { + NSLog(@"������������������"); + return; + } + + if (session == nil) { + NSLog(@"���������������������"); + return; + } + + // ������������ + drawLayer = [CALayer layer]; + + drawLayer.frame = self.parentView.bounds; + + [self.parentView.layer insertSublayer:drawLayer atIndex:0]; + + // ������������ + previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session]; + + previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; + previewLayer.frame = self.parentView.bounds; + + [self.parentView.layer insertSublayer:previewLayer atIndex:0]; +} + +/// ������������������ +- (void)setupSession { + + // 1> ������������ + AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; + AVCaptureDeviceInput *videoInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil]; + + if (videoInput == nil) { + NSLog(@"������������������������"); + return; + } + + // 2> ������������ + AVCaptureMetadataOutput *dataOutput = [[AVCaptureMetadataOutput alloc] init]; + + // 3> ������������ - ������������������������ + session = [[AVCaptureSession alloc] init]; + if (![session canAddInput:videoInput]) { + NSLog(@"������������������������"); + session = nil; + + return; + } + if (![session canAddOutput:dataOutput]) { + NSLog(@"������������������������"); + session = nil; + + return; + } + + // 4> ��������������������������� + [session addInput:videoInput]; + [session addOutput:dataOutput]; + + // 5> ������������������ + dataOutput.metadataObjectTypes = dataOutput.availableMetadataObjectTypes; + [dataOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; + + // 6> ������������������������ + [self setupLayers]; +} + +@end -- Gitblit v1.8.0