zoukankan      html  css  js  c++  java
  • iOS自带扫描 和 生成二维码

     

    1.二维码生成libqrencode介绍:是一个用C语言编写的用来解析二维条形码(QRCode)的程序库,libqrencode通过手机的CCD摄像头来扫描二维条形码。导入libqrencode库,下面直接代码:[objc] view plaincopy#import < ...

    1.二维码生成

    libqrencode介绍:是一个用C语言编写的用来解析二维条形码(QRCode)的程序库,libqrencode通过手机的CCD摄像头来扫描二维条形码。

    导入libqrencode库,下面直接代码:

     

    [objc] view plaincopy
     
    1. #import <Foundation/Foundation.h>  
    2.   
    3. @interface QRCodeGenerator : NSObject  
    4.   
    5. + (UIImage *)qrImageForString:(NSString *)string imageSize:(CGFloat)size;  
    6. + (UIImage *) twoDimensionCodeImage:(UIImage *)twoDimensionCode withAvatarImage:(UIImage *)avatarImage;  
    7. @end  

    [objc] view plaincopy
     
    1. #import "QRCodeGenerator.h"  
    2. #import "qrencode.h"  
    3.   
    4. enum {  
    5.     qr_margin = 3  
    6. };  
    7.   
    8. @implementation QRCodeGenerator  
    9.   
    10. + (void)drawQRCode:(QRcode *)code context:(CGContextRef)ctx size:(CGFloat)size {  
    11.     unsigned charchar *data = 0;  
    12.     int width;  
    13.     data = code->data;  
    14.     width = code->width;  
    15.     float zoom = (double)size / (code->width + 2.0 * qr_margin);  
    16.     CGRect rectDraw = CGRectMake(00, zoom, zoom);  
    17.       
    18.     // draw  
    19.     CGContextSetFillColor(ctx, CGColorGetComponents([UIColor blackColor].CGColor));  
    20.     for(int i = 0; i < width; ++i) {  
    21.         for(int j = 0; j < width; ++j) {  
    22.             if(*data & 1) {  
    23.                 rectDraw.origin = CGPointMake((j + qr_margin) * zoom,(i + qr_margin) * zoom);  
    24.                 CGContextAddRect(ctx, rectDraw);  
    25.             }  
    26.             ++data;  
    27.         }  
    28.     }  
    29.     CGContextFillPath(ctx);  
    30. }  
    31.   
    32. + (UIImage *)qrImageForString:(NSString *)string imageSize:(CGFloat)size {  
    33.     if (![string length]) {  
    34.         return nil;  
    35.     }  
    36.       
    37.     QRcode *code = QRcode_encodeString([string UTF8String], 0, QR_ECLEVEL_L, QR_MODE_81);  
    38.     if (!code) {  
    39.         return nil;  
    40.     }  
    41.       
    42.     // create context  
    43.     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();  
    44.     CGContextRef ctx = CGBitmapContextCreate(0, size, size, 8size * 4, colorSpace, kCGImageAlphaPremultipliedLast);  
    45.       
    46.     CGAffineTransform translateTransform = CGAffineTransformMakeTranslation(0, -size);  
    47.     CGAffineTransform scaleTransform = CGAffineTransformMakeScale(1, -1);  
    48.     CGContextConcatCTM(ctx, CGAffineTransformConcat(translateTransform, scaleTransform));  
    49.       
    50.     // draw QR on this context    
    51.     [QRCodeGenerator drawQRCode:code context:ctx size:size];  
    52.       
    53.     // get image  
    54.     CGImageRef qrCGImage = CGBitmapContextCreateImage(ctx);  
    55.     UIImage * qrImage = [UIImage imageWithCGImage:qrCGImage];  
    56.       
    57.     // some releases  
    58.     CGContextRelease(ctx);  
    59.     CGImageRelease(qrCGImage);  
    60.     CGColorSpaceRelease(colorSpace);  
    61.     QRcode_free(code);  
    62.       
    63.     return qrImage;  
    64. }  
    65.   
    66. + (UIImage *) twoDimensionCodeImage:(UIImage *)twoDimensionCode withAvatarImage:(UIImage *)avatarImage{  
    67.       
    68.     // two-dimension code 二维码  
    69.       
    70.     CGSize size = twoDimensionCode.size;  
    71.       
    72.     CGSize size2 =CGSizeMake(1.0 / 5.5 * size.width1.0 / 5.5 * size.height);  
    73.       
    74.       
    75.       
    76.     UIGraphicsBeginImageContext(size);  
    77.       
    78.       
    79.       
    80.     [twoDimensionCode drawInRect:CGRectMake(00, size.width, size.height)];  
    81.       
    82.     [[self avatarImage:avatarImage] drawInRect:CGRectMake((size.width - size2.width) / 2.0, (size.height - size2.height) / 2.0, size2.width, size2.height)];  
    83.       
    84.       
    85.       
    86.     UIImage *resultingImage =UIGraphicsGetImageFromCurrentImageContext();  
    87.       
    88.     UIGraphicsEndImageContext();  
    89.       
    90.     return resultingImage;  
    91.       
    92. }  
    93.   
    94.   
    95. + (UIImage *) avatarImage:(UIImage *)avatarImage{  
    96.       
    97.     UIImage * avatarBackgroudImage = [UIImage imageNamed:@"icon.png"];  
    98.       
    99.     CGSize size = avatarBackgroudImage.size;  
    100.       
    101.     UIGraphicsBeginImageContext(size);  
    102.       
    103.       
    104.       
    105.     [avatarBackgroudImage drawInRect:CGRectMake(00, size.width, size.height)];  
    106.       
    107.     [avatarImage drawInRect:CGRectMake(1010, size.width - 20, size.height - 20)];  
    108.       
    109.       
    110.       
    111.     UIImage *resultingImage =UIGraphicsGetImageFromCurrentImageContext();  
    112.       
    113.     UIGraphicsEndImageContext();  
    114.       
    115.     return resultingImage;  
    116.       
    117. }  
    118.   
    119. @end  

    2.扫描

     

    iOS7苹果推出了自带的扫描功能,下面直接代码:

     

     

    [objc] view plaincopy
     
    1. -(void)viewWillAppear:(BOOL)animated  
    2. {  
    3.     [self setupCamera];  
    4. }  
    5. - (void)setupCamera  
    6. {  
    7.     // Device  
    8.     _device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];  
    9.       
    10.     // Input  
    11.     _input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil];  
    12.       
    13.     // Output  
    14.     _output = [[AVCaptureMetadataOutput alloc]init];  
    15.     [_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];  
    16.       
    17.     // Session  
    18.     _session = [[AVCaptureSession alloc]init];  
    19.     [_session setSessionPreset:AVCaptureSessionPresetHigh];  
    20.     if ([_session canAddInput:self.input])  
    21.     {  
    22.         [_session addInput:self.input];  
    23.     }  
    24.       
    25.     if ([_session canAddOutput:self.output])  
    26.     {  
    27.         [_session addOutput:self.output];  
    28.     }  
    29.       
    30.     // 条码类型 AVMetadataObjectTypeQRCode  
    31.     _output.metadataObjectTypes =@[AVMetadataObjectTypeCode128Code,AVMetadataObjectTypeUPCECode,AVMetadataObjectTypeCode39Code,AVMetadataObjectTypeCode39Mod43Code,AVMetadataObjectTypeEAN13Code,AVMetadataObjectTypeEAN8Code,AVMetadataObjectTypeCode93Code,AVMetadataObjectTypePDF417Code,AVMetadataObjectTypeQRCode,AVMetadataObjectTypeAztecCode,AVMetadataObjectTypeInterleaved2of5Code,AVMetadataObjectTypeITF14Code,AVMetadataObjectTypeDataMatrixCode] ;  
    32.       
    33.     // Preview  
    34.     _preview =[AVCaptureVideoPreviewLayer layerWithSession:self.session];  
    35.     _preview.videoGravity = AVLayerVideoGravityResizeAspectFill;  
    36.     _preview.frame =CGRectMake(20,110,280,280);  
    37.     [self.view.layer insertSublayer:self.preview atIndex:0];  
    38.       
    39.   
    40.       
    41.     // Start  
    42.     [_session startRunning];  
    43. }  
    44. #pragma mark AVCaptureMetadataOutputObjectsDelegate  
    45. - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection  
    46. {  
    47.      
    48.     NSString *stringValue;  
    49.       
    50.     if ([metadataObjects count] >0)  
    51.     {  
    52.         AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:0];  
    53.         stringValue = metadataObject.stringValue;  
    54.     }  
    55.       
    56.     [_session stopRunning];  
    57.     UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"提示" message:[NSString stringWithFormat:@"结果:%@",stringValue] delegate:self cancelButtonTitle:nil otherButtonTitles:@"知道了",@"重新扫描", nil nil];  
    58.     [alert show];  
    59. }  
    60. - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex  
    61. {  
    62.     if(buttonIndex == 0)  
    63.     {  
    64.         [self dismissViewControllerAnimated:YES completion:^  
    65.          {  
    66.              [timer invalidate];  
    67.          }];  
    68.   
    69.     }  
    70.     else  
    71.     {  
    72.         [_session startRunning];  
    73.     }  
    74. }  
  • 相关阅读:
    【JZOJ100047】基因变异【BFS】
    【JZOJ100047】基因变异【BFS】
    【JZOJ100046】收集卡片【模拟】
    【JZOJ100046】收集卡片【模拟】
    【NOIP2018】【洛谷P5022】旅行【基环树】
    【NOIP2018】【洛谷P5022】旅行【基环树】
    【POJ3417】Network【LCA】【差分】
    【POJ3417】Network【LCA】【差分】
    初学编程,选C还是选C++,你选对了吗
    TIOBE9月编程语言排行榜:时隔五年,为什么C语言依然排行第一
  • 原文地址:https://www.cnblogs.com/allen123/p/4465861.html
Copyright © 2011-2022 走看看