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