前幾天項(xiàng)目中要加入一個(gè)掃描二維碼的功能骚腥,包括相機(jī)掃描和相冊(cè)掃描隧哮,因?yàn)轫?xiàng)目是從iOS 9及以上支持的熟掂,所以相冊(cè)掃描直接使用原生的CIDetector來(lái)實(shí)現(xiàn)桨昙。嘎嘎嘎一頓操作代碼之后我在自己的手機(jī)上(iOS 12)看各種掃描效果讲弄,完美措左。
但是今天測(cè)試小姐姐拿著一臺(tái)測(cè)試機(jī)來(lái)找我,說(shuō)同一個(gè)二維碼避除,相機(jī)掃描可以識(shí)別怎披,相冊(cè)掃描如果是截圖的圖片就可以識(shí)別,如果是相機(jī)拍照所得的圖片就識(shí)別不出來(lái)瓶摆。我第一反應(yīng)就是不可能吧凉逛,之前在自己手機(jī)上都試過(guò)了怎么樣都可以識(shí)別,但是測(cè)試小姐姐丟給我兩部iPhone(iOS 9 和 iOS10)讓我試一試群井,最后我都發(fā)現(xiàn)相冊(cè)掃描的時(shí)候?qū)τ谂臄z所得的二維碼圖片確實(shí)無(wú)法識(shí)別状飞,幾臺(tái)iOS 12的就都OK......
聯(lián)機(jī)調(diào)試,在不ok的設(shè)備上,識(shí)別到的CIFeature
數(shù)組的個(gè)數(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)象確實(shí)是存在的酵使,只是解決辦法倒是沒(méi)見(jiàn)著,最后看到一個(gè)人說(shuō)把圖片縮小成256像素就可以提高識(shí)別率自晰,個(gè)人覺(jué)得這是屬于有點(diǎn)兒“歪門邪道”的解決方式凝化,但是確實(shí)找不到更簡(jiǎn)便的解決方式。
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
}
修改之后測(cè)了一下酬荞,那些iOS 9搓劫、iOS10的設(shè)備對(duì)于拍攝所得的二維碼照片的識(shí)別都成功了。