周末闲来无事,看到微信上有个长按识别二维码的功能,挺好奇它的实现过程,就想着想着如何实现的。下面就是它的大致上的重要技术细节。
思路:
我们oc中是有一个原生的二维码识别库。使用这个的条件是你要有一个二维码的图片就可以了,把图片给它它就能识别图片上的二维码信息。那问题来了怎么获取web页上的二维码呢?这就是这里技术的难点。我的答案是使用js将图片获取下来。下面就看具体做法。
js获取:
大家就会想一个页面上有这么多图片我那里知道我点击后能对应的获取对应图片啊?我这里做的比较粗糟我是给每个图片都给一个点击事件,点击那个图片就能相应的获取对应的图片。
代码:
[_webViews stringByEvaluatingJavaScriptFromString:@"function registerImageClickAction(){\
var imgs=document.getElementsByTagName('img');\
var length=imgs.length;\
for(var i=0;i<length;i++){\
img=imgs[i];\
img.onclick=function(){\
window.imageUrl.bitUrl(this.src);}\
}\
}"];
[_webViews stringByEvaluatingJavaScriptFromString:@"registerImageClickAction();"];
获取到图片地址后加载具体的图片和识别二维码:
[self.imageViews sd_setImageWithURL:url completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
// self.imageViews.image = image;
NSLog(@"这里有图片没有:%@",image);
//识别图片是否有二维码
CIContext *contexts = [CIContext contextWithOptions:nil];
_detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:contexts options:@{CIDetectorAccuracy:CIDetectorAccuracyHigh}];
NSArray *features = [self.detector featuresInImage:[CIImage imageWithCGImage:image.CGImage]];
NSLog(@"有多少个数组:%@",features);
if (features.count >0) {
CIQRCodeFeature *feature = [features objectAtIndex:0];
NSString *scannedResult = feature.messageString;
NSLog(@"这里可以在图片加载完成之后做些事情:%@",scannedResult);
}
}];