先在控制器里面創(chuàng)建一個UIimageView來充當二維碼的容器
CGFloatqrImageViewWH =SP(190);
CGFloatqrImageViewX =0.5*(SCREEN_WIDTH- qrImageViewWH);
UIImageView* qrImageView = [[UIImageViewalloc]initWithFrame:CGRectMake(qrImageViewX, iconImageView.bottom+SP(35), qrImageViewWH, qrImageViewWH)];
qrImageView.backgroundColor= [UIColorrandomColor];
[self.viewaddSubview:qrImageView];
self.qrImageView= qrImageView;//在此記得設(shè)置為成員變量
然后調(diào)用生成二維碼的方法
#pragma mark - creatQR
- (void)creatQR
{
//創(chuàng)建過濾器
CIFilter* filter = [CIFilterfilterWithName:@"CIQRCodeGenerator"];
//恢復(fù)默認
[filtersetDefaults];
//給過濾器添加數(shù)據(jù)http://www.txship.com/
NSString* dataStr =@"http://www.txship.com";
NSData* data = [dataStrdataUsingEncoding:NSUTF8StringEncodingallowLossyConversion:YES];
//通過KVO設(shè)置濾鏡inputMessage數(shù)據(jù)
[filtersetValue:dataforKey:@"inputMessage"];
//獲取輸出的二維碼
CIImage* qrImage = [filteroutputImage];
//將CIImage裝換為UIimage并放大顯示
self.qrImageView.image= [self createNonInterpolatedUIImageFormCIImage:qrImage withSize:SP(190)];
}
這樣就可以生成一個二維碼了瘫俊,但是這樣生成的二維碼不清晰
可以調(diào)用下面方法來還原二維碼的清晰度特幔,把輸出的二維碼傳到這個方法中赖舟,同時設(shè)置二維碼的尺寸 你會得到一個全新的 UIimage 再復(fù)制給全局變量裝二維碼的容器中
/**
*根據(jù)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.創(chuàng)建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];
}
截圖功能
傳進入你想要截圖的view ?然后會返回給你一個UIImage對象
#pragma mark -截圖功能
-(UIImage*)captureImageFromView:(UIView*)view
{
CGRectscreenRect = [viewbounds];
UIGraphicsBeginImageContext(screenRect.size);
CGContextRefctx =UIGraphicsGetCurrentContext();
[view.layerrenderInContext:ctx];
UIImage* image =UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
returnimage;
}
/**
*? 根據(jù)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.創(chuàng)建bitmap;size_t width =CGRectGetWidth(extent) * scale;? ? size_t height =CGRectGetHeight(extent) * scale;CGColorSpaceRefcs =CGColorSpaceCreateDeviceGray();CGContextRefbitmapRef =CGBitmapContextCreate(nil, width, height,8,0, cs, (CGBitmapInfo)kCGImageAlphaNone);CIContext*context = [CIContextcontextWithOptions:nil];CGImageRefbitmapImage = [context createCGImage:image fromRect:extent];CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);CGContextScaleCTM(bitmapRef, scale, scale);CGContextDrawImage(bitmapRef, extent, bitmapImage);// 2.保存bitmap到圖片CGImageRefscaledImage =CGBitmapContextCreateImage(bitmapRef);CGContextRelease(bitmapRef);CGImageRelease(bitmapImage);return[UIImageimageWithCGImage:scaledImage];}
二維碼的掃描
// 1.創(chuàng)建捕捉會話AVCaptureSession*session = [[AVCaptureSessionalloc] init];self.session= session;// 2.添加輸入設(shè)備(數(shù)據(jù)從攝像頭輸入)AVCaptureDevice*device = [AVCaptureDevicedefaultDeviceWithMediaType:AVMediaTypeVideo];AVCaptureDeviceInput*input = [AVCaptureDeviceInputdeviceInputWithDevice:device error:nil];? ? [session addInput:input];// 3.添加輸出數(shù)據(jù)(示例對象-->類對象-->元類對象-->根元類對象)AVCaptureMetadataOutput*output = [[AVCaptureMetadataOutputalloc] init];? ? [output setMetadataObjectsDelegate:selfqueue:dispatch_get_main_queue()];? ? [session addOutput:output];// 3.1.設(shè)置輸入元數(shù)據(jù)的類型(類型是二維碼數(shù)據(jù))[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];// 4.添加掃描圖層AVCaptureVideoPreviewLayer*layer = [AVCaptureVideoPreviewLayerlayerWithSession:session];? ? layer.frame=self.view.bounds;? ? [self.view.layeraddSublayer:layer];self.layer= layer;// 5.開始掃描[session startRunning];
掃描到結(jié)果后會調(diào)用的方法
// 當掃描到數(shù)據(jù)時就會執(zhí)行該方法- (void)captureOutput:(AVCaptureOutput*)captureOutput didOutputMetadataObjects:(NSArray*)metadataObjects fromConnection:(AVCaptureConnection*)connection{if(metadataObjects.count>0) {//獲得掃描數(shù)據(jù),最后一個時最新掃描的數(shù)據(jù)AVMetadataMachineReadableCodeObject*object = [metadataObjects lastObject];NSLog(@"%@", object.stringValue);// 停止掃描[self.sessionstopRunning];// 將預(yù)覽圖層移除[self.layerremoveFromSuperlayer];? ? }else{NSLog(@"沒有掃描到數(shù)據(jù)");? ? }}