iOS微小型條碼的掃描

之前做了一個(gè)功能,要求掃描二維碼和微小型條碼的掃描,微小型條碼有多小,當(dāng)客戶(hù)一拿過(guò)來(lái)的時(shí)候我一臉蒙逼。條碼高度就只有這一行字的高度,在紙上密密麻麻貼了一大條。這怎么掃?我馬上用ZXing,ZBar什么的試了下,成功率極低。這顯然無(wú)法滿(mǎn)足需求。然后自己琢磨用系統(tǒng)提供的方法實(shí)現(xiàn)。先上代碼:

/// 開(kāi)始準(zhǔn)備掃描(關(guān)鍵代碼)
- (void)beginScanning {
//初始化相機(jī)設(shè)備
AVCaptureDevice * device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput * input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
if (!input) {
    return;
}
AVCaptureMetadataOutput * output = [[AVCaptureMetadataOutput alloc]init];
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

//========核心代碼==========設(shè)置掃描區(qū)域//
CGSize size = self.view.bounds.size;
CGRect cropRect = _scanWindow.frame;
CGFloat p1 = size.height/size.width;
CGFloat p2 = 1920./1080.;//使用 _session.sessionPreset = AVCaptureSessionPreset1920x1080;
if (p1 < p2) {
    CGFloat fixHeight = self.view.bounds.size.width * 1920. / 1080.;
    CGFloat fixPadding = (fixHeight - size.height)/2;
    output.rectOfInterest = CGRectMake((cropRect.origin.y + fixPadding)/fixHeight,
                                       cropRect.origin.x/size.width,
                                       cropRect.size.height/fixHeight,
                                       cropRect.size.width/size.width);
} else {
    CGFloat fixWidth = self.view.bounds.size.height * 1080. / 1920.;
    CGFloat fixPadding = (fixWidth - size.width)/2;
    output.rectOfInterest = CGRectMake(cropRect.origin.y/size.height,
                                       (cropRect.origin.x + fixPadding)/fixWidth,
                                       cropRect.size.height/size.height,
                                       cropRect.size.width/fixWidth);
}
_session = [[AVCaptureSession alloc]init];

//掃描小型條碼使用圖片輸出 1920x1080提高精確度
_session.sessionPreset = AVCaptureSessionPreset1920x1080;

[_session addInput:input];
[_session addOutput:output];

//設(shè)置條碼類(lèi)型
output.metadataObjectTypes=@[AVMetadataObjectTypeCode128Code];

AVCaptureVideoPreviewLayer * layer = [AVCaptureVideoPreviewLayer layerWithSession:_session];
layer.videoGravity = AVLayerVideoGravityResizeAspectFill;
layer.frame = self.view.layer.bounds;
[self.view.layer insertSublayer:layer atIndex:0];
[_session startRunning];}

前面沒(méi)什么說(shuō)的,初始化video,input,output。關(guān)鍵問(wèn)題來(lái)了,正確設(shè)置掃描區(qū)域,這一步很重要。然后將sessionPreset設(shè)置為AVCaptureSessionPreset1920x1080,因?yàn)槭且獟呙栉⑿⌒蜅l形碼,必須要提高圖片輸出質(zhì)量,以此提高掃描成功率。一般的掃碼使用AVCaptureSessionPreset640x480就夠了。其次設(shè)置你要掃描的條碼類(lèi)型這里是AVMetadataObjectTypeCode128Code。

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

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

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