目标解码模拟激光条码扫描器的行为。然而,读者不是看整个视野,而是试图解码只在激光瞄准点下的条形码。这可以防止操作人员意外读取附近的其他条形码。
支持设备:
配置DMCC:
启用或禁用目标解码(或检索它的状态)。
默认值:关闭
实例
ReaderDevice.getDatamansystem()。sendcommand(“设置解码器.target-解码”);
ReaderDevice.getDatamansystem()。sendcommand(“设置解码器.target-解码”);
self.readerDevice.dataManSystem()。sendCommand(“设置解码器。TARGET-DECODING”)
[self.readerDevice。dataManSystem sendCommand: @”设置解码器。TARGET-DECODING”);
设置(或获取)中心窗口的大小。数字以图像的百分比表示。
如果条形码与居中窗口重叠,则对该条形码进行解码。因此,居中窗口不一定需要包含整个条形码。
默认值:50 50 10 10
实例
readerDevice.getDataManSystem()。sendCommand(“设置解码器。中心窗口50 50 5 5”);
self.readerDevice.dataManSystem().sendCommand(“SET DECODER.CENTERING-WINDOW 50 5”)
[self.readerDevice.dataManSystem sendCommand:@“设置解码器.定心窗口50 5”];
如果将居中窗口添加到SVG结果,则设置(或获取)。
默认值:
实例
readerDevice.getDataManSystem()。sendCommand(“设置解码器。DISPLAY-TARGET”);
self.readerDevice.dataManSystem()。sendCommand(“设置解码器。DISPLAY-TARGET”)
[self.readerDevice。dataManSystem sendCommand: @”设置解码器。DISPLAY-TARGET”);
备注
以下是相机AP(黄色,较小的矩形是目标解码窗口)中启用目标解码时的扫描预览示例I:
目标解码窗口(矩形)的颜色和线的权重可以改变:
MWOverlay。targetRectLineColor = Color.RED;MWOverlay。targetRectLineWidth = 2;
MWOverlay.setTargetRectLineUIColor (UIColor.red) MWOverlay.setTargetRectLineWidth (2)
[MWOverlay setTargetRectLineUIColor:(用户界面颜色redColor]];[MWOverlay setTargetRectLineWidth: 2];
如果你想一次扫描更多的条形码,在一个扫描会话中,你可以使用多码阅读。
支持设备:
配置DMCC:
设置译码器为成功读取结果所应查找的码数。
默认值:1
实例
readerDevice.getDataManSystem().sendCommand(“SET MULTICODE.NUM-CODES 3”);
self.readerDevice.dataManSystem()。sendCommand(“多码。NUM-CODES 3”)
[self.readerDevice。dataManSystem sendCommand: @”设置多码。NUM-CODES 3”);
定义读取器如何解释要查找的代码数。
默认值:关闭
实例
readerDevice.getDataManSystem()。sendCommand(“多码。部分结果”);
self.readerDevice.dataManSystem().sendCommand(“将MULTICODE.PARTIAL-RESULTS设置为ON”)
[self.readerDevice.dataManSystem sendCommand:@“将MULTICODE.PARTIAL-RESULTS设置在”];
如果此代码是在最近N次读取中读取的,则不要读取代码。
默认值:0(无限制)
实例
readerDevice.getDataManSystem()。sendCommand(“设置解码器。REREAD-NOT-LAST-N 1 ");
self.readerDevice.dataManSystem()。sendCommand(“设置解码器。REREAD-NOT-LAST-N 1”)
[self.readerDevice.dataManSystem sendCommand:@“设置解码器。重新读取-非最后一次-N 1”];
为每个符号组定义要查找的预期最大代码数:
任何单一符号的期望值都不能超过MULTICODE参数。num代码,要找到的代码的总数。第一个参数是符号群,第二个参数是最大码数。
缺省值:1
实例
readerDevice.getDataManSystem().sendCommand(“SET MULTICODE.MAX-NUM-CODES 1 3”);
self.readerDevice.dataManSystem()。sendCommand(“多码。MAX-NUM-CODES 1 3”)
[self.readerDevice。dataManSystem sendCommand: @”设置多码。MAX-NUM-CODES 1 3”);
备注
如果启用了多代码读取,则可以在onReadResultReceived回调函数中使用getSubResults ()ReadResults对象的方法。如果禁用多代码读取,此方法返回null。
解析器帮助我们将解码结果提取为结构化格式(JSON、键值),用于搜索、排序和验证。有六种类型的解析器:
在cmbSDK中也有使用AUTO解析器类型的选项,它会尝试找到最适合的。
支持设备:
使用setParser ()方法来设置要使用的解析器类型,或getParser()获取选定的类型。在与读取器设备有效连接后设置解析器类型。默认情况下没有。
实例
setParser(ResultParser.AAMVA);
self.readerDevice.parser=CMBResultParserAAMVA
self.readerDevice.parser = CMBResultParserAAMVA;
启用所需的解析器类型后,您可以从ReadResult的onReadResultReceived回调函数中接收的结果获取结构化格式:
//从结果中返回json格式的解析文本。//从结果结果中返回解析后的文本。
让结果:[CMBReadResult] = readResults?。readResults一样吗?(CMBReadResult) ? ?[] //从结果返回json格式的解析文本让parsedJSON = results.first?parsedJSON //从结果返回解析的文本让parsedText = results.first
NSArray* results = readResults.readResults;NSString* parsedJSON = [[result firstObject] parsedJSON]; //从结果返回json格式的解析文本//从结果返回解析文本NSString* parsedText =[[结果firstObject] parsedText];
您可以使用此功能指定将用于定位和解码符号的图像的确切区域。如果两个条形码距离很近,并且您需要确保只阅读目标区域的代码,那么这将非常有用。减少感兴趣区域并不一定会减少解码时间或增加图像传输速率。
支持设备:
配置DMCC:
(获取|设置)译码器。投资回报率[x w y h]
检查范围为0-100,宽度和高度的最小值为5,以及参数之间隐含的约束,例如给定轴的总和不超过100。
实例
readerDevice.getDataManSystem().sendCommand(“SET DECODER.ROI-PERCENT 10 80”);
self.readerDevice.dataManSystem()。sendCommand(“设置解码器。回报率10 80 10 80”)
[self.readerDevice.dataManSystem sendCommand:@“SET DECODER.ROI-PERCENT 10 80”];
SDK可以从图像文件中解码条形码(仅限摄像头API)。支持的图像格式包括BMP、PNG、JPG。图像大小不能大于5000 × 5000像素。
支持设备:
要扫描映像,应用程序必须首先将映像读入内存,然后使用图像加载DMCC命令来解码它。的readerDevice对象必须在发送图像加载命令下面是使用sendCommand方法启动图像加载作用
实例
readerDevice.getDataManSystem().sendCommand(String.format(“IMAGE.LOAD%d”,imageData.length),imageData,500,false,(dataManSystem,response)->{if(response.getError()!=null){//IMAGE.LOAD DMCC完成时出错,在此处处理错误});
self.readerDevice.dataManSystem()?.sendCommand(“IMAGE.LOAD\(imageData.count)”,with:imageData,timeout:100,expectBinaryResponse:false,callback:{(response)in if response?.status!=DMCC\u status\u NO\u ERROR{//IMAGE.LOAD DMCC finished with ERROR,在此处处理错误})
注意:imageData是图像的Data。
[self.readerDevice.dataManSystem sendCommand:[NSString stringWithFormat:@“IMAGE.LOAD%lu”,[imageData length]]withData:imageData超时:100 expectBinaryResponse:无回调:^(CDMResponse*response){如果(response.status!=DMCC_status_NO_ERROR){//IMAGE.LOAD DMCC已完成,但有错误,请在此处处理错误}}];
注:imageData是图像的NSData。
就像实时扫描一样,当图像加载命令完成后,将在您的数据库中的读取结果数组中接收结果ReaderDevice的使用以下方法委派:
收到ReadResultReceived时无效(ReaderDevice阅读器,ReadResults)
func didReceiveReadResult(fromReader:CMBReaderDevice,results readResults:CMBReadResults!)
- (void)didReceiveReadResultFromReader:(CMBReaderDevice *)reader results:(CMBReadResults *)readResults;
下面你会看到一个从你的设备照片库中选择和扫描图像的例子
private void pickImageFromGallery(){意图pickPhoto = new意图(意图。ACTION_PICK android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);startActivityForResult (pickPhoto PICK_IMAGE);} @Override void onActivityResult(int requestCode, int resultCode,)Intent data) {if(requestCode == PICK_IMAGE && resultCode == RESULT_OK && data != null && data. getdata () != null && readerDevice != null && readerDevice. getconnectionstate () == ConnectionState.Connected) {try (InputStream imageStream = getContentResolver().openInputStream(data. getdata ());ByteArrayOutputStream缓冲区= new ByteArrayOutputStream()) {int nRead;Byte [] bytes = new Byte [1024];while (nRead = imageStream.)读取(bytes, 0, bytes.length)) != -1);写(字节0 nRead);} buffer.flush (); final byte[] byteArray = buffer.toByteArray(); readerDevice.getDataManSystem().sendCommand(String.format("IMAGE.LOAD %d", byteArray.length), byteArray, 500, false, (dataManSystem, response) -> { if (response.getError() != null) { Toast.makeText(MainActivity.this, "ERROR [" + response.getError().toString() + "]: " + response.getError().getLocalizedMessage(), Toast.LENGTH_LONG).show(); } }); } catch (IOException e) { e.printStackTrace(); } } super.onActivityResult(requestCode, resultCode, data); }
func showImagePicker(){让imagePickerController = UIImagePickerController()allowsEditing = false imagePickerController.delegate = self imagePickerController。sourceType = . photolibrary。现在(imagePickerController, animated: true, completion: nil)} // MARK: UIImagePickerControllerDelegate方法func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info:){选择器。解雇(动画:真的,完成:nil)让imagePath = info (UIImagePickerController.InfoKey。imageURL] !NSURL guard让imageData = try?数据。init(contentsOf: imagePath.absoluteURL!) else {return} self.readerDevice.dataManSystem()?LOAD \(imageData.count)", with: imageData, timeout: 100, expectBinaryResponse: false, callback: {(response) in if response?。DMCC_STATUS_NO_ERROR {// IMAGE. status != DMCC_STATUS_NO_ERROR {// IMAGE. status !LOAD DMCC finished with error,在这里处理错误}})}
- (void)showImagePicker {UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];imagePickerController。allowsEditing =没有;imagePickerController.delegate =自我;[imagePickerController setSourceType: UIImagePickerControllerSourceTypePhotoLibrary];[self presentViewController:imagePickerController animated:YES completion:nil];} #pragma mark - UIImagePickerControllerDelegate - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{[self dismissViewControllerAnimated:YES completion:nil];NSURL *imagePath = [info valueForKey:UIImagePickerControllerImageURL];NSData *imageData = [NSData dataWithContentsOfURL:imagePath];if (imageData) {[self.readerDevice. if (imageData);dataManSystem sendCommand:(NSString stringWithFormat: @”形象。LOAD %lu", [imageData length]] withData:imageData timeout:100 expectBinaryResponse:NO callback:^(CDMResponse *response) { if (response.status != DMCC_STATUS_NO_ERROR) { // IMAGE.LOAD DMCC finished with error, handle the error here } }]; } }
由于某些一维条码中缺少纠错甚至校验和值,许多条码容易出现误读和短读(其中只有一部分条码被解码)。诸如打印质量差、照明不一致、图像模糊、极端倾斜和其他变量等因素都可能造成这种情况。
SDK缓解误读和短读的方法之一是使用一个称为位置验证的特性。当启用时,SDK将更加努力地验证一维条形码的边缘和完整位置;从而极大地减少了读取错误。请注意,位置验证可能会降低扫描性能,特别是当启用了多个符号或在cpu较慢的值行设备上使用时。
位置验证可用于以下条码类型(粗体条码默认启用此功能):代码11,代码25,Codabar,代码93,代码39,代码128,Telepen,MSI普莱西UPC / EAN。
在打击读取错误时,请考虑使用SDK的其他特征使用位置验证,例如设置最小读取长度并调整解码器的努力级别(请参阅DMCC命令解码器。
支持设备:
配置API:
实例
BarcodeScanner.MWBsetParam(BarcodeScanner.MWB_代码_掩码_39,BarcodeScanner.MWB_PAR_ID_验证_位置,BarcodeScanner.MWB_PAR_值_验证_位置_打开);
MWB_setParam (MWB_CODE_MASK_39 UInt32 (MWB_PAR_ID_VERIFY_LOCATION) UInt32 (MWB_PAR_VALUE_VERIFY_LOCATION_ON))
MWB_设置参数(MWB_代码_掩码_39、MWB_参数ID_验证_位置、MWB_参数值_验证_位置_开启);
默认情况下,使用camera API创建读卡器设备时,将使用全屏预览。如果要使用部分屏幕预览,则需要创建ViewGroup容器在你的布局为android或视图然后在reader设备构造函数中发送那个容器作为参数,否则如果那个参数没有被设置或者无效的设置时,将使用全屏预览。
当使用部分屏幕预览时,来自摄影机的帧将填充在预览容器中,如果预览容器的纵横比不同于摄影机的纵横比,我们将执行裁剪以避免失真。
支持设备:
实例
首先在你的布局/故事板中创建容器。
<?xml version=“1.0”encoding=“utf-8”>。。。。
稍后在创建读卡器设备时,将该容器作为读卡器设备构造函数中的参数发送
readerDevice = readerDevice。getPhoneCameraDevice (param_cameraMode, PreviewOption。违约,(ViewGroup) findViewById (R.id.rlPreviewContainer));
将新添加的UIView连接到ViewController中的插座
@IBV预览容器:UIView!
然后使用previewContainer作为构造函数中的参数创建readerDevice
让readerDevice=CMBReaderDevice.readerOfDeviceCamera(带:self.cameraMode,previewOptions:CDMPreviewOption.init(原始值:0),previewView:self.previewContainer)
将新添加的UIView连接到ViewController中的插座
@属性(弱、非原子)IBUIView*previewContainer;
然后使用previewContainer作为构造函数中的参数创建readerDevice
CMBReaderDevice*readerDevice=[CMBReaderDevice readerOfDeviceCameraWithCameraMode:cameraMode预览选项:kCDMPreviewOptionDefaults预览视图:self.previewContainer];
这是它的样子