目标解码模拟激光条码扫描器的行为。然而,读者不是看整个视野,而是试图解码只在激光瞄准点下的条形码。这可以防止操作人员意外读取附近的其他条形码。
支持设备:
配置dmcc:
启用或禁用目标解码(或检索它的状态)。
默认值:从
例子
readerDevice.getDataManSystem()。sendCommand(“设置解码器。TARGET-DECODING”);
readerDevice.getDataManSystem()。sendCommand(“设置解码器。TARGET-DECODING”);
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(“设置解码器。中心窗50 50 5 5”)
[self.readerDevice。dataManSystem sendCommand: @”设置解码器。居中窗50 50 5 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(“多码。NUM-CODES 3”);
self.readerDevice.dataManSystem()。sendCommand(“多码。NUM-CODES 3”)
[self.readerDevice。dataManSystem sendCommand: @”设置多码。NUM-CODES 3”);
定义读者如何解释要查找的代码数量。
默认值:从
例子
readerDevice.getDataManSystem()。sendCommand(“多码。部分结果”);
self.readerDevice.dataManSystem()。sendCommand(“多码。部分结果”)
[self.readerDevice。dataManSystem sendCommand: @”设置多码。部分结果”);
如果该代码是在最近N次读取期间读取的,则不要读取该代码。
默认值:0(无限制)
例子
readerDevice.getDataManSystem()。sendCommand(“设置解码器。REREAD-NOT-LAST-N 1 ");
self.readerDevice.dataManSystem()。sendCommand(“设置解码器。REREAD-NOT-LAST-N 1”)
[self.readerDevice。dataManSystem sendCommand: @”设置解码器。REREAD-NOT-LAST-N 1 ");
为每个符号组定义期望的最大编码数:
任何单一符号的期望值都不能超过MULTICODE参数。num代码,要找到的代码的总数。第一个参数是符号群,第二个参数是最大码数。
缺省值:1
例子
readerDevice.getDataManSystem()。sendCommand(“多码。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, Key-Value),用于搜索、排序和验证。解析器有六种类型:
在cmbSDK中也有使用AUTO解析器类型的选项,它会尝试找到最适合的。
支持设备:
使用setParser ()方法来设置要使用的解析器类型,或getParser ()获取选定的类型。在与读取器设备有效连接后设置解析器类型。默认情况下没有。
例子
readerDevice.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(“设置解码器。回报率10 80 10 80”);
self.readerDevice.dataManSystem()。sendCommand(“设置解码器。回报率10 80 10 80”)
[self.readerDevice。dataManSystem sendCommand: @”设置解码器。投资回报率10 80 10 80”];
SDK可以从图像文件中解码条形码(仅限摄像头API)。支持的图像格式包括BMP、PNG、JPG。图像大小不能大于5000 × 5000像素。
支持设备:
要扫描映像,应用程序必须首先将映像读入内存,然后使用的形象。负载DMCC命令来解码它。的readerDevice对象必须在发送的形象。负载命令。下面是使用sendCommand方法初始化的形象。负载函数。
例子
readerDevice.getDataManSystem () .sendCommand (String.format”的形象。负载%d", imageData.length), imageData, 500, false, (dataManSystem, response) -> { if (response.getError() != null) { // IMAGE.LOAD DMCC finished with error, handle the error here } });
self.readerDevice.dataManSystem () ? .sendCommand(”的形象。负载\(imageData.count)", with: imageData, timeout: 100, expectBinaryResponse: false, callback: { (response) in if response?.status != DMCC_STATUS_NO_ERROR { // IMAGE.LOAD DMCC finished with error, handle the error here } })
注意:imageData是图像的Data。
[self.readerDevice。dataManSystem sendCommand:(NSString stringWithFormat: @”形象。负载%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 } }];
注意:imageData是图像的NSData。
就像实时扫描一样,当的形象。负载命令完成后,结果在您的读取结果数组中接收ReaderDevice的使用以下方法委托:
void onReadResultReceived(ReaderDevice reader, ReadResults results)
func didReceiveReadResult(fromReader reader: 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()?负载\(imageData.count)", with: imageData, timeout: 100, expectBinaryResponse: false, callback: { (response) in if response?.status != DMCC_STATUS_NO_ERROR { // IMAGE.LOAD DMCC finished with error, handle the error here } }) }
- (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: @”形象。负载 %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,代码128Telepen,MSI普莱西UPC / EAN。
当处理读错误时,考虑结合SDK的其他特性使用位置验证,例如设置最小读长度和调整解码器的努力水平(参见DMCC命令decoder . effort)。
支持设备:
配置API:
例子
BarcodeScanner.MWBsetParam (BarcodeScanner。MWB_CODE_MASK_39 BarcodeScanner。MWB_PAR_ID_VERIFY_LOCATION BarcodeScanner.MWB_PAR_VALUE_VERIFY_LOCATION_ON);
MWB_setParam (MWB_CODE_MASK_39 UInt32 (MWB_PAR_ID_VERIFY_LOCATION) UInt32 (MWB_PAR_VALUE_VERIFY_LOCATION_ON))
MWB_setParam (MWB_CODE_MASK_39 MWB_PAR_ID_VERIFY_LOCATION MWB_PAR_VALUE_VERIFY_LOCATION_ON);
默认情况下,当你使用摄像头API创建阅读器时,全屏预览将被使用。如果你想使用部分屏幕预览,你需要创建ViewGroup容器在你的布局为android或视图然后在reader设备构造函数中发送那个容器作为参数,否则如果那个参数没有被设置或者零设置时,将使用全屏预览。
当使用部分屏幕预览时,来自相机的帧会被填充到预览容器中,如果预览容器的长宽比与相机的长宽比不同,我们会进行裁剪以避免失真。
支持设备:
例子
首先在你的布局/故事板中创建容器。
<?xml version = " 1.0 " encoding = " utf - 8 " ?> < android.support.constraint。ConstraintLayout xmlns: android = " http://schemas.android.com/apk/res/android " xmlns:应用= " http://schemas.android.com/apk/res-auto " xmlns:工具= " http://schemas.android.com/tools " android: layout_width =“match_parent”android: layout_height =“match_parent”android:背景=“333333 #”工具:= " cognex.com.cmbcamerademo.ScannerActivity " > < RelativeLayout上下文android:id="@+id/rlPreviewContainer" android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintBottom_toTopOf="@id/listResult" app:layout_constraintStart_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> ....
稍后当您创建读取器设备时,将该容器作为参数发送到读取器设备构造函数中
readerDevice = readerDevice。getPhoneCameraDevice (param_cameraMode, PreviewOption。违约,(ViewGroup) findViewById (R.id.rlPreviewContainer));
将新添加的UIView连接到ViewController中的outlet
@IBOutlet弱var previewContainer: UIView!
然后在构造函数中使用previewContainer作为参数创建readerDevice
让readerDevice = CMBReaderDevice。readerOfDeviceCamera(:自我。cameraMode previewOptions: CDMPreviewOption。init (rawValue: 0), previewView self.previewContainer):
将新添加的UIView连接到ViewController中的outlet
@property (weak, nonatomic) IBOutlet UIView *previewContainer;
然后在构造函数中使用previewContainer作为参数创建readerDevice
CMBReaderDevice *readerDevice = [CMBReaderDevice readerOfDeviceCameraWithCameraMode:cameraMode previewOptions:kCDMPreviewOptionDefaults previewView:self.previewContainer];
这是它的样子