之前做了一個(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。