前幾天項目中要加入一個掃描二維碼的功能,包括相機掃描和相冊掃描,因為項目是從iOS 9及以上支持的,所以相冊掃描直接使用原生的CIDetector來實現(xiàn)。嘎嘎嘎一頓操作代碼之后我在自己的手機上(iOS 12)看各種掃描效果,完美。
但是今天測試小姐姐拿著一臺測試機來找我,說同一個二維碼,相機掃描可以識別,相冊掃描如果是截圖的圖片就可以識別,如果是相機拍照所得的圖片就識別不出來。我第一反應(yīng)就是不可能吧,之前在自己手機上都試過了怎么樣都可以識別,但是測試小姐姐丟給我兩部iPhone(iOS 9 和 iOS10)讓我試一試,最后我都發(fā)現(xiàn)相冊掃描的時候?qū)τ谂臄z所得的二維碼圖片確實無法識別,幾臺iOS 12的就都OK......
聯(lián)機調(diào)試,在不ok的設(shè)備上,識別到的CIFeature數(shù)組的個數(shù)就是0:
if let detector = CIDetector.init(ofType: CIDetectorTypeQRCode, context: nil, options: [CIDetectorAccuracy : CIDetectorAccuracyHigh]) {
let features = detector.features(in: CIImage.init(cgImage: image.cgImage!))
}
網(wǎng)上搜索良久,發(fā)現(xiàn)這種現(xiàn)象確實是存在的,只是解決辦法倒是沒見著,最后看到一個人說把圖片縮小成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的設(shè)備對于拍攝所得的二維碼照片的識別都成功了。