前言:最近客户要求开发一个功能,类似微信长按图片识别图片中的二维码,一开始我使用了ZXingObjC,但是完成后被测试出有些二维码识别不了,所以只能另寻它法,之后更换为苹果系统自带的识别图片二维码的功能,但是这必须在iOS 8.0+才可使用,客户又要求必须支持iOS 7.0,于是我又写了一个Zbar识别图片二维码,但是Zbar还是有部分二维码识别不了。经过测试,最后我的解决方法是,iOS 8.0以上,使用系统自带的图片二维码识别,iOS 8.0以下使用 ZXingObjC + Zbar,这样基本上解决各种不同二维码的扫描问题。
1.IOS原生图片二维码识别(主要方法):
- (void)scanQRCode:(UIImage *)image {
CIDetector*detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{ CIDetectorAccuracy : CIDetectorAccuracyHigh }];
NSArray *features = [detector featuresInImage:[CIImage imageWithCGImage:image.CGImage]];
for (int index = 0; index < [features count]; index ++) {
CIQRCodeFeature *feature = [features objectAtIndex:index];
NSString *scannedResult = feature.messageString;
NSLog(@"result:%@",scannedResult);
}
}
2.ZXingObjC
由于本文主要介绍二维码图片的识别,本处只给出二维码识别主要代码.
- (void)scanQRCode:(UIImage *)image {
CGImageRef imageToDecode=[image CGImage];
ZXLuminanceSource * source = [[ZXCGImageLuminanceSource alloc] initWithCGImage:imageToDecode];
ZXBinaryBitmap * bitmap = [ZXBinaryBitmap binaryBitmapWithBinarizer:[ZXHybridBinarizer binarizerWithSource:source]];
NSError *error = nil;
ZXDecodeHints *hints = [ZXDecodeHints hints];
ZXMultiFormatReader * reader = [ZXMultiFormatReader reader];
ZXResult *result = [reader decode:bitmap hints:hints error:&error];
if (result) {
NSString *contents = result.text;
NSLog(@"%@",contents);
}
}
由于本文主要介绍二维码图片的识别,本处只给出二维码图片识别主要代码。
- (void)scanQRCode:(UIImage *)image {
UIImage *image = info[UIImagePickerControllerOriginalImage];
ZBarReaderController* read = [ZBarReaderController new];
read.readerDelegate = self;
CGImageRef cgImageRef = image.CGImage;
ZBarSymbol* symbol = nil;
for(symbol in [read scanImage:cgImageRef]) {
NSString *qrText = symbol.data ;
NSLog(@"result:%@",qrText);
}
}
结果:
1.IOS原生图片二维码识别全部都能识别出来,而且效率最高.
2.ZXingObjC识别不出下面的第三张和第七张
3.Zbar识别不出下面的第六张
4.iOS原生图片识别和Zbar图片识别,在一张图片上有多个二维码的情况下能同时识别出来,ZXingObjC方法只能识别出其中的一个。