如何从静态图像读取QR码

我知道您可以使用AVFoundation使用设备的相机扫描QR码。 现在问题来了,我怎么能从一个静态的UIImage对象呢?

核心图像具有CIDetector类,用于检测QR码的CIDetectorTypeQRCode 。 您可以提供静态图像或video的核心图像filter。

这应该符合你的需求。 有关更多信息,请参阅Xcode文档。

来自ShinobiControls的Github回购iOS8包括一个项目LiveDetection,展示了如何使用来自video源和静止图像的CIDetectorTypeQRCode。 它看起来像没有更新Swift 2.0,我无法得到它在Xcode 7.2.1下编译,但项目中的performQRCodeDetection函数编译。 (编译问题是用处理所有可怕的types转换的代码来处理Swift中的CVPixelBuffers ,如果你想要做的就是在静态图像中查找QRCodes,这并不重要。

编辑:

这是从该网站的关键方法(在斯威夫特)

 func performQRCodeDetection(image: CIImage) -> (outImage: CIImage?, decode: String) { var resultImage: CIImage? var decode = "" if let detector = detector { let features = detector.featuresInImage(image) for feature in features as! [CIQRCodeFeature] { resultImage = drawHighlightOverlayForPoints(image, topLeft: feature.topLeft, topRight: feature.topRight, bottomLeft: feature.bottomLeft, bottomRight: feature.bottomRight) decode = feature.messageString } } return (resultImage, decode) } 

iOS API从CoreImage框架提供CIDetector类。 CIDetector可让您在图像中find特定的图案,如脸部,笑脸,眼睛或QRCode。

这里是Objective-C中从UIImage中检测QRCode的代码:

 -(NSArray *)detectQRCode:(UIImage *) image { @autoreleasepool { NSLog(@"%@ :: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd)); NSCAssert(image != nil, @"**Assertion Error** detectQRCode : image is nil"); CIImage* ciImage = UIImage.CIImage; // assuming underlying data is a CIImage //CIImage* ciImage = [CIImage initWithCGImage: UIImage.CGImage]; // to use if the underlying data is a CGImage NSDictionary* options; CIContext* context = [CIContext context]; options = @{ CIDetectorAccuracy : CIDetectorAccuracyHigh }; // Slow but thorough //options = @{ CIDetectorAccuracy : CIDetectorAccuracyLow}; // Fast but superficial CIDetector* qrDetector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:context options:options]; if ([[ciImage properties] valueForKey:(NSString*) kCGImagePropertyOrientation] == nil) { options = @{ CIDetectorImageOrientation : @1}; } else { options = @{ CIDetectorImageOrientation : [[ciImage properties] valueForKey:(NSString*) kCGImagePropertyOrientation]}; } NSArray * features = [qrDetector featuresInImage:ciImage options:options]; return features; } } 

如果QRCode存在并检测到,则返回的NSArray*将包含CIFeature* 。 如果没有QRCode, NSArray*将是nil 。 如果QRCode解码失败, NSArray*将没有元素。

获取编码的string:

 if (features != nil && features.count > 0) { for (CIQRCodeFeature* qrFeature in features) { NSLog(@"QRFeature.messageString : %@ ", qrFeature.messageString); } } 

就像@ Duncan-C的答案一样,你可以提取QRCode的angular点,并在图像上绘制QRCode的封闭边界框。

注意:在iOS10.0 beta6下,当使用来自cameraSampleBuffer的图像时,调用[qrDetector featuresInImage:ciImage options:options]logging了这个内部警告(它运行平稳,但是用这个消息给控制台发送了垃圾邮件,我找不到现在摆脱它的方式):

locking计数为1时结束CVPixelBuffer 0x170133e20。

资源 :

Apple Dev API参考 – CIDetector

Apple Dev API编程指南 – 人脸检测

使用Zbar SDK从静态图像读取QR码

zbar和-SDK-IOS

请查看本教程关于Zbar SDK的整合。

ZBar SDK集成教程

然后尝试扫描静态图像。

使用Zbar扫描仪类来扫描您的图像。

这里是文档。

ZBarImageScanner。

举个例子,如何使用Zbar扫描仪类,

 ZBarImageScanner *scandoc = [[ZBarImageScanner alloc]init]; NSInteger resultsnumber = [scandoc scanImage:yourUIImage]; if(resultsnumber > 0){ ZBarSymbolSet *results = scandoc.results; //Here you will get result. } 

下面的链接将帮助你。

scaning-静态的UIImage -使用- IOS-zbar和-SDK