Thanks for downloading Dynamsoft Barcode Reader Package!
Your download will start shortly. If your download does not begin, click here to retry.
To install Dynamsoft Barcode Reader Windows Edition on your development machine, you can download the SDK from the Dynamsoft website and run the setup program. The trial installer includes a free trial license valid for 30 days.
After installation, you can find samples for supported platforms in the Samples folder under the installation folder.
BarcodeReadDemo_CPP
.BarcodeReadDemo_CPP.cpp
.
#include <stdio.h>
#include "<relative path>/DynamsoftBarcodeReader.h"
#ifdef _WIN64
#pragma comment(lib, "<relative path>/DBRx64.lib")
#else
#pragma comment(lib, "<relative path>/DBRx86.lib")
#endif
Please replace <relative path>
in the code with the relative path to the BarcodeReadDemo_CPP.cpp
file. Typically, The DynamsoftBarcodeReader.h
file can be found in [INSTALLATION FOLDER]\Components\C_C++\Include\
, and the LIB files can be found in [INSTALLATION FOLDER]\Components\C_C++\Lib\
.
BarcodeReadDemo_CPP.cpp
.
int main()
{
// Define variables
int iRet = -1;
int iLicMsg = -1;
TextResultArray *paryResult = NULL;
// Initialize license prior to any decoding
CBarcodeReader reader;
iLicMsg = reader.InitLicense("<your license key here>");
//If error occurs to the license initialization
if (iLicMsg != DBR_OK)
{
printf("Failed to initialize the license successfully: %d\r\n%s\r\n", iLicMsg, DBR_GetErrorString(iLicMsg));
return iLicMsg;
}
// Start decoding. Leave the template name empty ("") will use the settings from PublicRuntimeSettings.
iRet = reader.DecodeFile("<your image file full path>", "");
// If error occurs
if (iRet != DBR_OK)
{
printf("Failed to read barcode: %d\r\n%s\r\n", iRet, DBR_GetErrorString(iRet));
return iRet;
}
// If succeeds
reader.GetAllTextResults(&paryResult);
printf("%d total barcodes found. \r\n", paryResult->resultsCount);
for (int iIndex = 0; iIndex < paryResult->resultsCount; iIndex++)
{
printf("Result %d\r\n", iIndex + 1);
printf("BarcodeFormat: %s\r\n", paryResult->results[iIndex]->barcodeFormatString);
printf("Text read: %s\r\n", paryResult->results[iIndex]->barcodeText);
}
// Finally release BarcodeResultArray
CBarcodeReader::FreeTextResults(&paryResult);
system("pause");
return 0;
}
Please update <your image file full path>
and <your license key here>
in the code accordingly.
[INSTALLATION FOLDER]\Components\C_C++\Redist\
.
To test, you can open the Command Prompt and execute the EXE file with a barcode image.
To deploy your application, make sure the DLLs are in the same folder as the EXE file. See the Distribution section for more details.
The SDK provides multiple decoding methods that support reading barcodes from different sources, including static images, video stream, files in memory, base64 string, bitmap, etc. Here is a list of all decoding methods:
You can find more samples in more programming languages at Code Gallery.
Calling the decoding methods directly will use the default scanning modes and it will satisfy most of the needs. The SDK also allows you to adjust the scanning settings to optimize the scanning performance for different usage scenarios.
There are two ways to change the barcode reading settings - using the PublicRuntimeSettings Struct or template. For new developers, We recommend you to start with the PublicRuntimeSettings struct; For those who are experienced with the SDK, you may use a template which is more flexible and easier to update.
PublicRuntimeSettings
Struct to Change SettingsHere are some common scanning settings you might find helpful:
For more scanning settings guide, check out the How To section.
By default, the SDK will read all the supported barcode formats except Postal Codes and DotCode from the image. (See Product Overview for the full supported barcode list.)
If your full license only covers some barcode formats, you can use BarcodeFormatIds
and BarcodeFormatIds_2
to specify the barcode format(s). Check out BarcodeFormat
and BarcodeFormat_2
.
For example, to enable only 1D barcode reading, you can use the following code:
char sError[512];
TextResultArray* paryResult = NULL;
PublicRuntimeSettings* runtimeSettings = new PublicRuntimeSettings();
CBarcodeReader* reader = new CBarcodeReader();
//Initialize license prior to any decoding
//Replace "<Put your license key here>" with your own license
reader->InitLicense("<Put your license key here>");
//Set the barcode format
reader->GetRuntimeSettings(runtimeSettings);
runtimeSettings->barcodeFormatIds = 2047; //OneD barcode
reader->UpdateRuntimeSettings(runtimeSettings, sError, 512);
//Replace "<Put the path of your file here>" with your own file path
reader->DecodeFile("<Put your file path here>", "");
// If succeeds
reader->GetAllTextResults(&paryResult);
CBarcodeReader::FreeTextResults(&paryResult);
delete runtimeSettings;
delete reader;
By default, the SDK will read as many barcodes as it can. To increase the recognition efficiency, you can use expectedBarcodesCount
to specify the maximum number of barcodes to recognize according to your scenario.
char sError[512];
TextResultArray* paryResult = NULL;
PublicRuntimeSettings* runtimeSettings = new PublicRuntimeSettings();
CBarcodeReader* reader = new CBarcodeReader();
//Initialize license prior to any decoding
//Replace "<Put your license key here>" with your own license
reader->InitLicense("<Put your license key here>");
//Set the number of barcodes to be expected
reader->GetRuntimeSettings(runtimeSettings);
runtimeSettings->expectedBarcodesCount = 1;
reader->UpdateRuntimeSettings(runtimeSettings, sError, 512);
//Replace "Put the path of your file here" with your own file path
reader->DecodeFile("<Put your file path here>", "");
// If succeeds
reader->GetAllTextResults(&paryResult);
CBarcodeReader::FreeTextResults(&paryResult);
delete runtimeSettings;
delete reader;
By default, the barcode reader will search the whole image for barcodes. This can lead to poor performance especially when dealing with high-resolution images. You can speed up the recognition process by restricting the scanning region.
To specify a region, you will need to define an area. The following code shows how to create a template string and define the region.
char sError[512];
TextResultArray* paryResult = NULL;
PublicRuntimeSettings* runtimeSettings = new PublicRuntimeSettings();
CBarcodeReader* reader = new CBarcodeReader();
//Initialize license prior to any decoding
//Replace "<Put your license key here>" with your own license
reader->InitLicense("Put your license key here");
//Decode the barcodes on the left of the image
reader->GetRuntimeSettings(runtimeSettings);
runtimeSettings->region.regionBottom = 100;
runtimeSettings->region.regionLeft = 0;
runtimeSettings->region.regionRight = 50;
runtimeSettings->region.regionTop = 0;
runtimeSettings->region.regionMeasuredByPercentage = 1; //The region is determined by percentage
reader->UpdateRuntimeSettings(runtimeSettings, sError, 512);
//Replace "<Put the path of your file here>" with your own file path
reader->DecodeFile("<Put your file path here>", "");
// If succeeds
reader->GetAllTextResults(&paryResult);
CBarcodeReader::FreeTextResults(&paryResult);
delete runtimeSettings;
delete reader;
Besides the option of using the PublicRuntimeSettings struct, the SDK also provides InitRuntimeSettingsWithString
and InitRuntimeSettingsWithFile
APIs that enable you to use a template to control all the runtime settings. With a template, instead of writing many codes to modify the settings, you can manage all the runtime settings in a JSON file/string.
char sError[512];
TextResultArray* paryResult = NULL;
CBarcodeReader* reader = new CBarcodeReader();
//Initialize license prior to any decoding
//Replace "Put your license key here" with your own license
reader->InitLicense("Put your license key here");
//Use a template to modify the runtime settings
//InitRuntimeSettingsWithString() can also be used to modify the runtime settings with a json string
reader->InitRuntimeSettingsWithFile("<Put your file path here>", CM_OVERWRITE, sError, 512);
//Output runtime settings to a json file.
//OutputSettingsToString() can also be used to output the settings to a string
reader->OutputSettingsToFile("<Put your file path here>","currentruntime");
//Replace "Put the path of your file here" with your own file path
reader->DecodeFile("Put your file path here", "");
// If succeeds
reader->GetAllTextResults(&paryResult);
CBarcodeReader::FreeTextResults(&paryResult);
delete reader;
Below is a template for your reference. To learn more about the APIs, you can check out PublicRuntimeSettings
Struct.
{
"ImageParameter" : {
"BarcodeFormatIds" : [ "BF_ALL" ],
"BinarizationModes" : [
{
"BlockSizeX" : 0,
"BlockSizeY" : 0,
"EnableFillBinaryVacancy" : 1,
"ImagePreprocessingModesIndex" : -1,
"Mode" : "BM_LOCAL_BLOCK",
"ThreshValueCoefficient" : 10
}
],
"DeblurLevel" : 9,
"Description" : "",
"ExpectedBarcodesCount" : 0,
"GrayscaleTransformationModes" : [
{
"Mode" : "GTM_ORIGINAL"
}
],
"ImagePreprocessingModes" : [
{
"Mode" : "IPM_GENERAL"
}
],
"IntermediateResultSavingMode" : {
"Mode" : "IRSM_MEMORY"
},
"IntermediateResultTypes" : [ "IRT_NO_RESULT" ],
"MaxAlgorithmThreadCount" : 4,
"Name" : "runtimesettings",
"PDFRasterDPI" : 300,
"Pages" : "",
"RegionDefinitionNameArray" : null,
"RegionPredetectionModes" : [
{
"Mode" : "RPM_GENERAL"
}
],
"ResultCoordinateType" : "RCT_PIXEL",
"ScaleDownThreshold" : 2300,
"TerminatePhase" : "TP_BARCODE_RECOGNIZED",
"TextFilterModes" : [
{
"MinImageDimension" : 65536,
"Mode" : "TFM_GENERAL_CONTOUR",
"Sensitivity" : 0
}
],
"TextResultOrderModes" : [
{
"Mode" : "TROM_CONFIDENCE"
},
{
"Mode" : "TROM_POSITION"
},
{
"Mode" : "TROM_FORMAT"
}
],
"TextureDetectionModes" : [
{
"Mode" : "TDM_GENERAL_WIDTH_CONCENTRATION",
"Sensitivity" : 5
}
],
"Timeout" : 10000
},
"Version" : "3.0"
}
version 7.6.0