1.二维码生成libqrencode介绍:是一个用C语言编写的用来解析二维条形码(QRCode)的程序库,libqrencode通过手机的CCD摄像头来扫描二维条形码。导入libqrencode库,下面直接代码:[objc] view plaincopy#import < ...
1.二维码生成
libqrencode介绍:是一个用C语言编写的用来解析二维条形码(QRCode)的程序库,libqrencode通过手机的CCD摄像头来扫描二维条形码。
导入libqrencode库,下面直接代码:
?
- #import?<Foundation/Foundation.h>??
- ??
- @interface?QRCodeGenerator?:?NSObject??
- ??
- +?(UIImage?*)qrImageForString:(NSString?*)string?imageSize:(CGFloat)size;??
- +?(UIImage?*)?twoDimensionCodeImage:(UIImage?*)twoDimensionCode?withAvatarImage:(UIImage?*)avatarImage;??
- @end??
- #import?"QRCodeGenerator.h"??
- #import?"qrencode.h"??
- ??
- enum?{??
- ????qr_margin?=?3??
- };??
- ??
- @implementation?QRCodeGenerator??
- ??
- +?(void)drawQRCode:(QRcode?*)code?context:(CGContextRef)ctx?size:(CGFloat)size?{??
- ????unsigned?charchar?*data?=?0;??
- ????int?width;??
- ????data?=?code->data;??
- ????width?=?code->width;??
- ????float?zoom?=?(double)size?/?(code->width?+?2.0?*?qr_margin);??
- ????CGRect?rectDraw?=?CGRectMake(0,?0,?zoom,?zoom);??
- ??????
- ??????
- ????CGContextSetFillColor(ctx,?CGColorGetComponents([UIColor?blackColor].CGColor));??
- ????for(int?i?=?0;?i?<?width;?++i)?{??
- ????????for(int?j?=?0;?j?<?width;?++j)?{??
- ????????????if(*data?&?1)?{??
- ????????????????rectDraw.origin?=?CGPointMake((j?+?qr_margin)?*?zoom,(i?+?qr_margin)?*?zoom);??
- ????????????????CGContextAddRect(ctx,?rectDraw);??
- ????????????}??
- ????????????++data;??
- ????????}??
- ????}??
- ????CGContextFillPath(ctx);??
- }??
- ??
- +?(UIImage?*)qrImageForString:(NSString?*)string?imageSize:(CGFloat)size?{??
- ????if?(![string?length])?{??
- ????????return?nil;??
- ????}??
- ??????
- ????QRcode?*code?=?QRcode_encodeString([string?UTF8String],?0,?QR_ECLEVEL_L,?QR_MODE_8,?1);??
- ????if?(!code)?{??
- ????????return?nil;??
- ????}??
- ??????
- ??????
- ????CGColorSpaceRef?colorSpace?=?CGColorSpaceCreateDeviceRGB();??
- ????CGContextRef?ctx?=?CGBitmapContextCreate(0,?size,?size,?8,?size?*?4,?colorSpace,?kCGImageAlphaPremultipliedLast);??
- ??????
- ????CGAffineTransform?translateTransform?=?CGAffineTransformMakeTranslation(0,?-size);??
- ????CGAffineTransform?scaleTransform?=?CGAffineTransformMakeScale(1,?-1);??
- ????CGContextConcatCTM(ctx,?CGAffineTransformConcat(translateTransform,?scaleTransform));??
- ??????
- ??????
- ????[QRCodeGenerator?drawQRCode:code?context:ctx?size:size];??
- ??????
- ??????
- ????CGImageRef?qrCGImage?=?CGBitmapContextCreateImage(ctx);??
- ????UIImage?*?qrImage?=?[UIImage?imageWithCGImage:qrCGImage];??
- ??????
- ??????
- ????CGContextRelease(ctx);??
- ????CGImageRelease(qrCGImage);??
- ????CGColorSpaceRelease(colorSpace);??
- ????QRcode_free(code);??
- ??????
- ????return?qrImage;??
- }??
- ??
- +?(UIImage?*)?twoDimensionCodeImage:(UIImage?*)twoDimensionCode?withAvatarImage:(UIImage?*)avatarImage{??
- ??????
- ??????
- ??????
- ????CGSize?size?=?twoDimensionCode.size;??
- ??????
- ????CGSize?size2?=CGSizeMake(1.0?/?5.5?*?size.width,?1.0?/?5.5?*?size.height);??
- ??????
- ??????
- ??????
- ????UIGraphicsBeginImageContext(size);??
- ??????
- ??????
- ??????
- ????[twoDimensionCode?drawInRect:CGRectMake(0,?0,?size.width,?size.height)];??
- ??????
- ????[[self?avatarImage:avatarImage]?drawInRect:CGRectMake((size.width?-?size2.width)?/?2.0,?(size.height?-?size2.height)?/?2.0,?size2.width,?size2.height)];??
- ??????
- ??????
- ??????
- ????UIImage?*resultingImage?=UIGraphicsGetImageFromCurrentImageContext();??
- ??????
- ????UIGraphicsEndImageContext();??
- ??????
- ????return?resultingImage;??
- ??????
- }??
- ??
- ??
- +?(UIImage?*)?avatarImage:(UIImage?*)avatarImage{??
- ??????
- ????UIImage?*?avatarBackgroudImage?=?[UIImage?imageNamed:@"icon.png"];??
- ??????
- ????CGSize?size?=?avatarBackgroudImage.size;??
- ??????
- ????UIGraphicsBeginImageContext(size);??
- ??????
- ??????
- ??????
- ????[avatarBackgroudImage?drawInRect:CGRectMake(0,?0,?size.width,?size.height)];??
- ??????
- ????[avatarImage?drawInRect:CGRectMake(10,?10,?size.width?-?20,?size.height?-?20)];??
- ??????
- ??????
- ??????
- ????UIImage?*resultingImage?=UIGraphicsGetImageFromCurrentImageContext();??
- ??????
- ????UIGraphicsEndImageContext();??
- ??????
- ????return?resultingImage;??
- ??????
- }??
- ??
- @end??
2.扫描
?
iOS7苹果推出了自带的扫描功能,下面直接代码:
?
?
- -(void)viewWillAppear:(BOOL)animated??
- {??
- ????[self?setupCamera];??
- }??
- -?(void)setupCamera??
- {??
- ??????
- ????_device?=?[AVCaptureDevice?defaultDeviceWithMediaType:AVMediaTypeVideo];??
- ??????
- ??????
- ????_input?=?[AVCaptureDeviceInput?deviceInputWithDevice:self.device?error:nil];??
- ??????
- ??????
- ????_output?=?[[AVCaptureMetadataOutput?alloc]init];??
- ????[_output?setMetadataObjectsDelegate:self?queue:dispatch_get_main_queue()];??
- ??????
- ??????
- ????_session?=?[[AVCaptureSession?alloc]init];??
- ????[_session?setSessionPreset:AVCaptureSessionPresetHigh];??
- ????if?([_session?canAddInput:self.input])??
- ????{??
- ????????[_session?addInput:self.input];??
- ????}??
- ??????
- ????if?([_session?canAddOutput:self.output])??
- ????{??
- ????????[_session?addOutput:self.output];??
- ????}??
- ??????
- ??????
- ????_output.metadataObjectTypes?=@[AVMetadataObjectTypeCode128Code,AVMetadataObjectTypeUPCECode,AVMetadataObjectTypeCode39Code,AVMetadataObjectTypeCode39Mod43Code,AVMetadataObjectTypeEAN13Code,AVMetadataObjectTypeEAN8Code,AVMetadataObjectTypeCode93Code,AVMetadataObjectTypePDF417Code,AVMetadataObjectTypeQRCode,AVMetadataObjectTypeAztecCode,AVMetadataObjectTypeInterleaved2of5Code,AVMetadataObjectTypeITF14Code,AVMetadataObjectTypeDataMatrixCode]?;??
- ??????
- ??????
- ????_preview?=[AVCaptureVideoPreviewLayer?layerWithSession:self.session];??
- ????_preview.videoGravity?=?AVLayerVideoGravityResizeAspectFill;??
- ????_preview.frame?=CGRectMake(20,110,280,280);??
- ????[self.view.layer?insertSublayer:self.preview?atIndex:0];??
- ??????
- ??
- ??????
- ??????
- ????[_session?startRunning];??
- }??
- #pragma?mark?AVCaptureMetadataOutputObjectsDelegate??
- -?(void)captureOutput:(AVCaptureOutput?*)captureOutput?didOutputMetadataObjects:(NSArray?*)metadataObjects?fromConnection:(AVCaptureConnection?*)connection??
- {??
- ?????
- ????NSString?*stringValue;??
- ??????
- ????if?([metadataObjects?count]?>0)??
- ????{??
- ????????AVMetadataMachineReadableCodeObject?*?metadataObject?=?[metadataObjects?objectAtIndex:0];??
- ????????stringValue?=?metadataObject.stringValue;??
- ????}??
- ??????
- ????[_session?stopRunning];??
- ????UIAlertView?*?alert?=?[[UIAlertView?alloc]initWithTitle:@"提示"?message:[NSString?stringWithFormat:@"结果:%@",stringValue]?delegate:self?cancelButtonTitle:nil?otherButtonTitles:@"知道了",@"重新扫描",?nil?nil];??
- ????[alert?show];??
- }??
- -?(void)alertView:(UIAlertView?*)alertView?clickedButtonAtIndex:(NSInteger)buttonIndex??
- {??
- ????if(buttonIndex?==?0)??
- ????{??
- ????????[self?dismissViewControllerAnimated:YES?completion:^??
- ?????????{??
- ?????????????[timer?invalidate];??
- ?????????}];??
- ??
- ????}??
- ????else??
- ????{??
- ????????[_session?startRunning];??
- ????}??
- }??