iOS实战

二维码

2016-11-01  本文已影响51人  DDY
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仅供参考]
[文中代码工程]

上一篇 下一篇

猜你喜欢

热点阅读