iOS二維碼生成及二維碼掃描

二維碼生成步驟:

1.導入CoreImage框架

2.通過濾鏡CIFilter生成二維碼

示例代碼:

?1.創建過濾器

CIFilter*filter = [CIFilterfilterWithName:@"CIQRCodeGenerator"];

2.恢復默認

[filtersetDefaults];

?3.給過濾器添加數據(正則表達式/賬號和密碼)

NSString*dataString =@"http://www.520it.com";

NSData*data = [dataStringdataUsingEncoding:NSUTF8StringEncoding];

[filtersetValue:dataforKeyPath:@"inputMessage"];

?4.獲取輸出的二維碼

CIImage*outputImage = [filteroutputImage];

?5.顯示二維碼

self.imageView.image= [selfcreateNonInterpolatedUIImageFormCIImage:outputImagewithSize:200];

在第五步顯示二維碼的時候用了一個自己封裝的方法(解決二維碼圖片不清晰)

具體方法如下:

/**

*根據CIImage生成指定大小的UIImage

*

*? @param image CIImage

*? @param size圖片寬度

*/

- (UIImage*)createNonInterpolatedUIImageFormCIImage:(CIImage*)image withSize:(CGFloat) size

{

CGRectextent =CGRectIntegral(image.extent);

CGFloatscale =MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));

// 1.創建bitmap;

size_twidth =CGRectGetWidth(extent) * scale;

size_theight =CGRectGetHeight(extent) * scale;

CGColorSpaceRefcs =CGColorSpaceCreateDeviceGray();

CGContextRefbitmapRef =CGBitmapContextCreate(nil, width, height,8,0, cs, (CGBitmapInfo)kCGImageAlphaNone);

CIContext*context = [CIContextcontextWithOptions:nil];

CGImageRefbitmapImage = [contextcreateCGImage:imagefromRect:extent];

CGContextSetInterpolationQuality(bitmapRef,kCGInterpolationNone);

CGContextScaleCTM(bitmapRef, scale, scale);

CGContextDrawImage(bitmapRef, extent, bitmapImage);

// 2.保存bitmap到圖片

CGImageRefscaledImage =CGBitmapContextCreateImage(bitmapRef);

CGContextRelease(bitmapRef);

CGImageRelease(bitmapImage);

return[UIImageimageWithCGImage:scaledImage];

}

以上完整生成二維碼的代碼詳見gitHub:https://github.com/KimsLeo/joker2.git

二維碼掃描

// 1.創建捕捉會話

AVCaptureSession*session = [[AVCaptureSessionalloc]init];

self.session= session;

// 2.添加輸入設備(數據從攝像頭輸入)

AVCaptureDevice*device = [AVCaptureDevicedefaultDeviceWithMediaType:AVMediaTypeVideo];

AVCaptureDeviceInput*input = [AVCaptureDeviceInputdeviceInputWithDevice:deviceerror:nil];

[sessionaddInput:input];

// 3.添加輸出數據(示例對象-->類對象-->元類對象-->根元類對象)

AVCaptureMetadataOutput*output = [[AVCaptureMetadataOutputalloc]init];

[outputsetMetadataObjectsDelegate:selfqueue:dispatch_get_main_queue()];

[sessionaddOutput:output];

// 3.1.設置輸入元數據的類型(類型是二維碼數據)

[outputsetMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];

// 4.添加掃描圖層

AVCaptureVideoPreviewLayer*layer = [AVCaptureVideoPreviewLayerlayerWithSession:session];

layer.frame=self.view.bounds;

[self.view.layeraddSublayer:layer];

self.layer= layer;

// 5.開始掃描

[sessionstartRunning];

掃描數據以后的方法回調(捕捉掃描數據):

#pragma mark -實現output的回調方法

//當掃描到數據時就會執行該方法

- (void)captureOutput:(AVCaptureOutput*)captureOutput didOutputMetadataObjects:(NSArray*)metadataObjects fromConnection:(AVCaptureConnection*)connection

{

if(metadataObjects.count>0) {

AVMetadataMachineReadableCodeObject*object = [metadataObjectslastObject];

NSLog(@"%@", object.stringValue);

//停止掃描

[self.sessionstopRunning];

//將預覽圖層移除

[self.layerremoveFromSuperlayer];

}else{

NSLog(@"沒有掃描到數據");

}

}

掃描二維碼的完整代碼詳見gitHub:https://github.com/KimsLeo/joker2.git

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容