二维码
2016-11-01 本文已影响51人
DDY
![](https://img.haomeiwen.com/i1465510/14cc18e6266e600e.png)
![](http://upload-images.jianshu.io/upload_images/1465510-e11c79e912bfd2e1.jpg)
1. 生成二维码
#pragma mark 生成原始二维码
- (CIImage *)generateQRCodeWithData:(NSString *)data
{
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
[filter setDefaults];
[filter setValue:[data dataUsingEncoding:NSUTF8StringEncoding] forKeyPath:@"inputMessage"];
[filter setValue:@"H" forKey:@"inputCorrectionLevel"];
return [filter outputImage];
}
2.生成条形码
#pragma mark 生成原始条形码
- (CIImage *)generateBarCodeWithData:(NSString *)data
{
CIFilter *filter = [CIFilter filterWithName:@"CICode128BarcodeGenerator"];
[filter setValue:[data dataUsingEncoding:NSUTF8StringEncoding] forKey:@"inputMessage"];
[filter setValue:@(0.00) forKey:@"inputQuietSpace"]; // 上下左右的margin值
return [filter outputImage];
}
3.扫描二维码/条形码
// 遵循代理 AVCaptureMetadataOutputObjectsDelegate
@property (nonatomic, strong) AVCaptureSession *captureSession;
@property (nonatomic, strong) AVCaptureVideoPreviewLayer *previewLayer;
#pragma mark 摄像头扫描二维码
- (void)ddy_ScanQRCodeWithCameraContainer:(UIView *)container
{
_captureSession = [[AVCaptureSession alloc] init];
if ([_captureSession canSetSessionPreset:AVCaptureSessionPresetHigh]) {
[_captureSession setSessionPreset:AVCaptureSessionPresetHigh];
}
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
AVCaptureMetadataOutput *metadataOutput = [[AVCaptureMetadataOutput alloc] init];
[metadataOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
// 扫描范围,原点在右上角
metadataOutput.rectOfInterest = CGRectMake(scanY/DDYSCREENH, scanX/DDYSCREENW, scanW/DDYSCREENH, scanW/DDYSCREENW);
if ([_captureSession canAddInput:deviceInput]) {
[_captureSession addInput:deviceInput];
}
if ([_captureSession canAddOutput:metadataOutput]) {
[_captureSession addOutput:metadataOutput];
}
metadataOutput.metadataObjectTypes = @[AVMetadataObjectTypeQRCode, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code];
_previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:_captureSession];
_previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
_previewLayer.frame = container.bounds;
[container.layer insertSublayer:_previewLayer atIndex:0];
[_captureSession startRunning];
}
#pragma mark 扫描结果
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
if (metadataObjects && metadataObjects.count) {
AVMetadataMachineReadableCodeObject *obj = metadataObjects[0];
NSString *resultStr = [obj stringValue];
BOOL success = metadataObjects && metadataObjects.count && ![resultStr isBlankString];
if(success)
{
NSLog(@"%@".resultStr);
}
}
}
4.相册选择识别二维码/条形码
#pragma mark 图片读取二维码 */
- (void)ddy_scanQRCodeWithImage:(UIImage *)image
{
UIImage *img = [image imageSizeInScreen];
CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy: CIDetectorAccuracyHigh}];
NSArray *features = [detector featuresInImage:[CIImage imageWithCGImage:img.CGImage]];
NSString *resultStr;
for (int i = 0; i<features.count; i++) {
CIQRCodeFeature *feature = [features objectAtIndex:i];
resultStr = feature.messageString;
}
BOOL success = features && features.count && ![resultStr isBlankString];
[self scanQRCodeResult:resultStr success:success];
}
5.长按识别二维码
给图片添加长按手势,调用图片扫描方式
#pragma mark 长按录制
- (void)touchToScan
{
[[DDYQRCodeManager sharedManager] ddy_scanQRCodeWithImage:_myQRCodeImg];
}
6.给二维码添加头像,更改颜色
#pragma mark 改变前景和背景色
- (CIImage *)changeColor:(CIImage *)image color:(UIColor *)color bgColor:(UIColor *)bgColor
{
CIFilter *filter = [CIFilter filterWithName:@"CIFalseColor"];
[filter setDefaults];
[filter setValue:image forKey:@"inputImage"];
[filter setValue:[CIColor colorWithCGColor:bgColor.CGColor] forKey:@"inputColor0"];
[filter setValue:[CIColor colorWithCGColor:color.CGColor] forKey:@"inputColor1"];
return [filter outputImage];
}
#pragma mark 改变宽高
- (UIImage *)changeSize:(CIImage *)image width:(CGFloat)width height:(CGFloat)height
{
CGRect extent = CGRectIntegral(image.extent);
CGFloat scale = MIN(width/CGRectGetWidth(extent), width/CGRectGetHeight(extent));
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGContextRef contentRef = CGBitmapContextCreate(nil, width, height, 8, 0, colorSpaceRef, kCGBitmapByteOrder32Little|kCGImageAlphaNoneSkipLast);
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef imageRef = [context createCGImage:image fromRect:extent];
CGContextSetInterpolationQuality(contentRef, kCGInterpolationNone);
CGContextScaleCTM(contentRef, scale, scale);
CGContextDrawImage(contentRef, extent, imageRef);
CGImageRef imageRefResized = CGBitmapContextCreateImage(contentRef);
CGContextRelease(contentRef);
CGImageRelease(imageRef);
return [UIImage imageWithCGImage:imageRefResized];
}
#pragma mark 添加logo
- (UIImage *)addLogo:(UIImage *)image logo:(UIImage *)logo logoScale:(CGFloat)logoScale
{
CGFloat scale = logoScale>0 ? (logoScale<0.3?logoScale:0.3) : 0.25;
CGFloat logoW = image.size.width * scale;
CGFloat logoX = (image.size.width-logoW)/2.0;
UIGraphicsBeginImageContext(image.size);
[image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
[logo drawInRect:CGRectMake(logoX, logoX, logoW, logoW)];
UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return resultImage;
}