一 生成二維碼
20 某些二維碼中間有圖檔,可以直接在imageView添加圖檔居中
//1.建立過濾器
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
//2.恢複預設
[filter setDefaults];
//3.給過濾器添加資料
NSString *str = @"二維碼學習"; //也直接輸出網址,掃描會自動跳轉
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
[filter setValue:data forKey:@"inputMessage"];
//4.擷取輸出二維碼
CIImage *outputImage = [filter outputImage];
//5.顯示二維碼
self.imageView.image = [UIImage imageWithCIImage:outputImage];
//解決模糊方法
// self.imageView.image = [self createNonInterpolatedUIImageFromCIImage:outputImage withSize:200];
生成二維碼解決方法
23 -(UIImage *)createNonInterpolatedUIImageFromCIImage:(CIImage *)image withSize:(CGFloat)size
{
CGRect extent = CGRectIntegral(image.extent);
CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
//1.建立bitmap
size_t width = CGRectGetWidth(extent) *scale;
size_t height = CGRectGetHeight(extent) *scale;
CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();
CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef bitmapImage = [context createCGImage:image fromRect:extent];
CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);
CGContextScaleCTM(bitmapRef, scale, scale);
CGContextDrawImage(bitmapRef, extent, bitmapImage);
//2.儲存bitmap到圖檔
CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
CGContextRelease(bitmapRef);
CGImageRelease(bitmapImage);
return [UIImage imageWithCGImage:scaledImage];
}
二 二維碼識别
49 @interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate>
@property (weak, nonatomic)AVCaptureSession *session;
@property (weak, nonatomic)AVCaptureVideoPreviewLayer *layer;
- (IBAction)scan:(UIButton *)sender {
//1.建立捕捉會話
AVCaptureSession *session = [[AVCaptureSession alloc] init];
self.session = session;
//2.設定輸入裝置 設定為攝像頭
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *inputDevice = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
[session addInput:inputDevice];
//3.設定輸出方式 代理資料輸出資料
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
[session addOutput:output];
[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
//4.添加一個顯示的layer 類似攝像頭拍照閱覽
AVCaptureVideoPreviewLayer *layer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
layer.frame = self.view.bounds;
[self.view.layer addSublayer:layer];
self.layer = layer;
//5.開始掃描
[session startRunning];
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
if (metadataObjects.count > 0) {
//1.擷取掃描結果
AVMetadataMachineReadableCodeObject *object = [metadataObjects lastObject];
self.outLabel.text = object.stringValue;
//2.停止掃描
[self.session stopRunning];
//3.移除圖層
[self.layer removeFromSuperlayer];
}else{
NSLog(@"沒有掃描到資料");
}
三 ZBarSDK的使用
導入必要的架構
1).快速內建
實作ZBarReaderDelegate協定
35 //二維碼識别
-(void)sysbutbuttonclick{
//初始化相機控制器
ZBarReaderViewController *reader = [ZBarReaderViewController new];
//設定代理
reader.readerDelegate = self;
//基本适配
reader.supportedOrientationsMask = ZBarOrientationMaskAll;
//二維碼/條形碼識别設定
ZBarImageScanner *scanner = reader.scanner;
[scanner setSymbology: ZBAR_I25
config: ZBAR_CFG_ENABLE
to: 0];
//彈出系統照相機,全屏拍攝
[self presentViewController:reader animated:YES completion:nil];
- (void) imagePickerController: (UIImagePickerController*) reader
didFinishPickingMediaWithInfo: (NSDictionary*) info
{
NSLog(@"info=%@",info);
// 得到條形碼結果
id<NSFastEnumeration> results =[info objectForKey: ZBarReaderControllerResults];
ZBarSymbol *symbol = nil;
for(symbol in results)
// EXAMPLE: just grab the first barcode
break;
NSLog(@"%@",symbol.data);
2).自定義視窗
實作ZBarReaderViewDelegate協定
38 //二維碼識别
//初始化照相機視窗
ZBarReaderView *readview = [ZBarReaderView new];
//自定義大小
readview.frame = myScreen;
//自定義添加相關訓示.........發揮各自的APP的想象力
//此處省略美化10000行代碼...................
//………………………..
// 好進入正題—— 接着設定好代理
readview.readerDelegate = self;
//将其照相機拍攝視圖添加到要顯示的視圖上
[self.view addSubview:readview];
ZBarImageScanner *scanner = readview.scanner;
//啟動,必須啟動後,手機攝影頭拍攝的即時圖像菜可以顯示在readview上
[readview start];
-(void)readerView:(ZBarReaderView *)readerView didReadSymbols:(ZBarSymbolSet *)symbols fromImage:(UIImage *)image
ZBarSymbol *symbol = nil;
for (symbol in symbols) {
break;
NSLog(@"========%@==========",symbol.data);
本文轉自 卓行天下 51CTO部落格,原文連結:http://blog.51cto.com/9951038/1757594,如需轉載請自行聯系原作者