ios 自带的二维码生成

1.二维码生成

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

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

  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  

 

  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苹果推出了自带的扫描功能,下面直接代码:

 

    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.     }  

posted @ 2015-04-28 20:39  曦阳  阅读(496)  评论(0编辑  收藏  举报