前几天项目中要加入一个扫描二维码的功能,包括相机扫描和相册扫描,因为项目是从iOS 9及以上支持的,所以相册扫描直接使用原生的CIDetector来实现。嘎嘎嘎一顿操作代码之后我在自己的手机上(iOS 12)看各种扫描效果,完美。
但是今天测试小姐姐拿着一台测试机来找我,说同一个二维码,相机扫描可以识别,相册扫描如果是截图的图片就可以识别,如果是相机拍照所得的图片就识别不出来。我第一反应就是不可能吧,之前在自己手机上都试过了怎么样都可以识别,但是测试小姐姐丢给我两部iPhone(iOS 9 和 iOS10)让我试一试,最后我都发现相册扫描的时候对于拍摄所得的二维码图片确实无法识别,几台iOS 12的就都OK......
联机调试,在不ok的设备上,识别到的CIFeature
数组的个数就是0:
if let detector = CIDetector.init(ofType: CIDetectorTypeQRCode, context: nil, options: [CIDetectorAccuracy : CIDetectorAccuracyHigh]) {
let features = detector.features(in: CIImage.init(cgImage: image.cgImage!))
}
网上搜索良久,发现这种现象确实是存在的,只是解决办法倒是没见着,最后看到一个人说把图片缩小成256像素就可以提高识别率,个人觉得这是属于有点儿“歪门邪道”的解决方式,但是确实找不到更简便的解决方式。
private func redrawAlbumImage(_ image: UIImage) -> UIImage? {
let originalSize = image.size
var newWidth: CGFloat = 0, newHeight: CGFloat = 0
if originalSize.width > originalSize.height {
newHeight = 256.0
newWidth = originalSize.width / originalSize.height * newHeight
}else {
newWidth = 256.0
newHeight = originalSize.height / originalSize.width * newWidth
}
UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight))
image.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
修改之后测了一下,那些iOS 9、iOS10的设备对于拍摄所得的二维码照片的识别都成功了。
网友评论