iOS自带扫描 和 生成二维码

来源:互联网 发布:java编写软件的图标 编辑:程序博客网 时间:2024/05/21 22:23

原文地址:iOS自带扫描 和 生成二维码

1.二维码生成

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

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

0 0
原创粉丝点击