二维码

作者: DDY | 来源:发表于2016-11-01 14:35 被阅读51次
    QRCode.png QRCode.jpg

    1. 生成二维码

    #pragma mark 生成原始二维码
    - (CIImage *)generateQRCodeWithData:(NSString *)data
    {
        CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
        [filter setDefaults];
        [filter setValue:[data dataUsingEncoding:NSUTF8StringEncoding] forKeyPath:@"inputMessage"];
        [filter setValue:@"H" forKey:@"inputCorrectionLevel"];
        return [filter outputImage];
    }
    

    2.生成条形码

    #pragma mark 生成原始条形码
    - (CIImage *)generateBarCodeWithData:(NSString *)data
    {
        CIFilter *filter = [CIFilter filterWithName:@"CICode128BarcodeGenerator"];
        [filter setValue:[data dataUsingEncoding:NSUTF8StringEncoding] forKey:@"inputMessage"];
        [filter setValue:@(0.00) forKey:@"inputQuietSpace"];  // 上下左右的margin值
        return [filter outputImage];
    }
    

    3.扫描二维码/条形码

    // 遵循代理 AVCaptureMetadataOutputObjectsDelegate
    
    @property (nonatomic, strong) AVCaptureSession *captureSession;
    
    @property (nonatomic, strong) AVCaptureVideoPreviewLayer *previewLayer;
    
    #pragma mark 摄像头扫描二维码
    - (void)ddy_ScanQRCodeWithCameraContainer:(UIView *)container
    {
        _captureSession = [[AVCaptureSession alloc] init];
        if ([_captureSession canSetSessionPreset:AVCaptureSessionPresetHigh]) {
            [_captureSession setSessionPreset:AVCaptureSessionPresetHigh];
        }
        AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
        AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
        AVCaptureMetadataOutput *metadataOutput = [[AVCaptureMetadataOutput alloc] init];
        [metadataOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
        // 扫描范围,原点在右上角
        metadataOutput.rectOfInterest = CGRectMake(scanY/DDYSCREENH, scanX/DDYSCREENW, scanW/DDYSCREENH, scanW/DDYSCREENW);
        
        if ([_captureSession canAddInput:deviceInput]) {
            [_captureSession addInput:deviceInput];
        }
        if ([_captureSession canAddOutput:metadataOutput]) {
            [_captureSession addOutput:metadataOutput];
        }
        
        metadataOutput.metadataObjectTypes = @[AVMetadataObjectTypeQRCode, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code];
        
        _previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:_captureSession];
        _previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
        _previewLayer.frame = container.bounds;
        [container.layer insertSublayer:_previewLayer atIndex:0];
        [_captureSession startRunning];
    }
    
    #pragma mark 扫描结果
    - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
        if (metadataObjects && metadataObjects.count) {
            AVMetadataMachineReadableCodeObject *obj = metadataObjects[0];
            NSString *resultStr = [obj stringValue];
            BOOL success = metadataObjects && metadataObjects.count && ![resultStr isBlankString];
            if(success)
    {
    NSLog(@"%@".resultStr);
    }
        }
    }
    

    4.相册选择识别二维码/条形码

    #pragma mark 图片读取二维码 */
    - (void)ddy_scanQRCodeWithImage:(UIImage *)image
    {
        UIImage *img = [image imageSizeInScreen];
        CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy: CIDetectorAccuracyHigh}];
        NSArray *features = [detector featuresInImage:[CIImage imageWithCGImage:img.CGImage]];
        NSString *resultStr;
        
        for (int i = 0; i<features.count; i++) {
            CIQRCodeFeature *feature = [features objectAtIndex:i];
            resultStr = feature.messageString;
        }
        BOOL success = features && features.count && ![resultStr isBlankString];
        
        [self scanQRCodeResult:resultStr success:success];
    }
    

    5.长按识别二维码

    给图片添加长按手势,调用图片扫描方式

    
    #pragma mark 长按录制
    - (void)touchToScan
    {
        [[DDYQRCodeManager sharedManager] ddy_scanQRCodeWithImage:_myQRCodeImg];
    }
    

    6.给二维码添加头像,更改颜色

    #pragma mark 改变前景和背景色
    - (CIImage *)changeColor:(CIImage *)image color:(UIColor *)color bgColor:(UIColor *)bgColor
    {
        CIFilter *filter = [CIFilter filterWithName:@"CIFalseColor"];
        [filter setDefaults];
        [filter setValue:image forKey:@"inputImage"];
        [filter setValue:[CIColor colorWithCGColor:bgColor.CGColor] forKey:@"inputColor0"];
        [filter setValue:[CIColor colorWithCGColor:color.CGColor] forKey:@"inputColor1"];
        return [filter outputImage];
    }
    
    #pragma mark 改变宽高
    - (UIImage *)changeSize:(CIImage *)image width:(CGFloat)width height:(CGFloat)height
    {
        CGRect extent = CGRectIntegral(image.extent);
        CGFloat scale = MIN(width/CGRectGetWidth(extent), width/CGRectGetHeight(extent));
        CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
        CGContextRef contentRef = CGBitmapContextCreate(nil, width, height, 8, 0, colorSpaceRef, kCGBitmapByteOrder32Little|kCGImageAlphaNoneSkipLast);
        CIContext *context = [CIContext contextWithOptions:nil];
        CGImageRef imageRef = [context createCGImage:image fromRect:extent];
        CGContextSetInterpolationQuality(contentRef, kCGInterpolationNone);
        CGContextScaleCTM(contentRef, scale, scale);
        CGContextDrawImage(contentRef, extent, imageRef);
        CGImageRef imageRefResized = CGBitmapContextCreateImage(contentRef);
        CGContextRelease(contentRef);
        CGImageRelease(imageRef);
        return [UIImage imageWithCGImage:imageRefResized];
    }
    
    #pragma mark 添加logo
    - (UIImage *)addLogo:(UIImage *)image logo:(UIImage *)logo logoScale:(CGFloat)logoScale
    {
        CGFloat scale = logoScale>0 ? (logoScale<0.3?logoScale:0.3) : 0.25;
        CGFloat logoW = image.size.width * scale;
        CGFloat logoX = (image.size.width-logoW)/2.0;
        UIGraphicsBeginImageContext(image.size);
        [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
        [logo drawInRect:CGRectMake(logoX, logoX, logoW, logoW)];
        UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return resultImage;
    }
    

    [Demo仅供参考]
    [文中代码工程]

    相关文章

      网友评论

        本文标题:二维码

        本文链接:https://www.haomeiwen.com/subject/jgemuttx.html