使用CIDetector扫描条形码(1和2维)
我想从实时相机和图像中扫描qr和条形码。我以前使用ZBar库来扫描代码。它不扫描特定类型的qr和条形码。此外,苹果的AVFoundation框架在从实时相机扫描代码时看起来更加快速准确。使用CIDetector扫描条形码(1和2维)
所以我不想使用ZBar。为了扫描从图库中挑选的图像中的代码,我使用了CIDetector。但似乎CIDetector无法扫描图像中的条形码。我已经找遍了堆过流CIDetector For other Barcode Types, Scanning barcode from UIImage natively (i.e., not using ZBar)
,但我还没有找到一种方法来扫描条形码形成图像使用CIDetector从画廊挑选。是否可以使用CIDetector从UIImages扫描条码?
不建议其他第三方库。我想用苹果的默认框架来完成这项工作。
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
{
[picker dismissViewControllerAnimated:YES completion:nil];
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
CIImage *img = [[CIImage alloc]initWithImage:image];
CIDetector* detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy:CIDetectorAccuracyHigh}];
if (detector)
{
NSArray* featuresR = [detector featuresInImage:img];
NSString* decodeR;
for (CIQRCodeFeature* featureR in featuresR)
{
NSLog(@"decode %@ ",featureR.messageString);
decodeR = featureR.messageString;
[self showAlertWithTitle:@"Success" withMessage:decodeR];
return;
}
[self showAlertWithTitle:@"Error" withMessage:@"Invalid Image"];
}
}
直到现在,苹果的AVFoundation Framework还没有提供扫描图像库中条形码的方法。
因此,我通过使用AVFoundation Framework在实时相机中扫描QR和条形码来解决我的问题,而当用户从图片库中照片图片时,我使用ZBar Framework扫描qr和条形码。
使用ZXing 库。
ZXingObjC是ZXing(“Zebra Crossing”)的完整Objective-C端口,是一款Java条码图像处理库。它旨在用于iOS设备和Mac应用程序。
我不想用任何第三方库进行扫描。 –
截至目前iOS的11 CIDetector
只以下类型的图像来检测
CIDetectorTypeFace
CIDetectorTypeRectange
CIDetectorTypeQRCode
CIDetectorTypeText
所以按照您的要求,我们不能真正依靠CIDectector
从图像读取条形码和QR码。但是,我们还有其他选项,如AVFoundation
框架AVCaptureMetadataOutput
,但我们需要有一个实时相机视图来检测条形码和QR码。
对于未来的读者,您可以查看Swift Camrea博客文章,以从自定义相机中检测元数据。
如果你的目标iOS11以上,我们确实有一组新的API Vision的从图像读取条形码。只需创建一个VNDetectBarcodesRequest
并获取条形码结果。查看Github的iOS 11 QR Code Example项目。请注意,由于iOS 11仅处于测试阶段,所以视觉API的文档还不够成熟。
您已经扫描了UIImages?将它们转换为CIImage([[CIImage alloc] initWithImage:image]),然后将它们传递给CIDetector。 – Lepidopteron
这只适用于扫描QR码,但不适用于条形码。对于包含条形码的图像,我在调用'featuresInImage'时获得了空数组。 –