iOS無法識別相冊中的二維碼

前幾天項目中要加入一個掃描二維碼的功能,包括相機掃描和相冊掃描,因為項目是從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è)備對于拍攝所得的二維碼照片的識別都成功了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容