Barcode print quality tests
In This Topic
The SDK contains tests which allow to determine the print quality of 1D linear barcodes, 2D matrix barcodes (Aztec, DataMatrix, Han Xin Code, QR Code, Micro QR Code) and 2D multi-row barcodes with cross-row scanning ability (PDF417, PDF417Compact, MicroPDF417).
For testing the
print quality of 1D linear barcodes, it is necessary to use the
ISO15416QualityTest class.
The algorithm of test is based on ISO/IEC 15416. The test allows to evaluate the print quality of barcode using the following parameters:
- Decode - indicates whether the barcode value is decoded successfully
- Max Reflectance (Rmax) - highest reflectance in any element or quiet zone in a scan reflectance profile
- Min Reflectance (Rmin) - lowest reflectance in any element in a scan reflectance profile, in percents of reflectance
- Symbol Contrast (SC) - symbol contrast, in percents of reflectance (difference between the highest and lowest reflectance value in the symbol region)
- Min Edge Contrast (ECmin) - minimum difference in the reflectance value between any particular space (including quiet zones) and its adjoining bar within a bar code symbol
- Modulation (MOD) - measure of the uniformity of reflectance of the dark and light elements respectively (MOD = ECmin/SC)
- Max Element Reflectance Non-uniformity (ERNmax) - maximum of difference in reflectance between the highest peak and lowest value within an element (bar or space) of the bar code symbol
- Defects - measure or ratio between the maximum element reflectance nonuniformity and symbol contrast (Defects = ERNmax / SC)
- Decodability - measure of accuracy of the printed bar code symbol against its appropriate reference decode algorithm
Here is an example that shows how to test print quality of 1D barcodes:
using System;
using Vintasoft.Imaging;
using Vintasoft.Barcode;
using Vintasoft.Barcode.BarcodeInfo;
using Vintasoft.Barcode.QualityTests;
/// <summary>
/// Test that shows how to test the print quality of 1D barcodes.
/// </summary>
class ISO15416QualityTestExample
{
/// <summary>
/// Runs the test.
/// </summary>
public static void Test()
{
// load image with barcode from file
using (VintasoftBitmap barcodeImage = ImageCodecs.Default.Decode("test1.jpg"))
{
// read barcodes from image and test the print quality of 1D barcodes
ReadBarcodesAndTestBarcodePrintQuality(barcodeImage);
}
}
/// <summary>
/// Reads barcodes from image and tests the print quality of 1D barcodes.
/// </summary>
static void ReadBarcodesAndTestBarcodePrintQuality(VintasoftBitmap imageWithBarcodes)
{
// create the barcode reader
using (BarcodeReader reader = new BarcodeReader())
{
// specify that reader must collect information for quality test
reader.Settings.CollectTestInformation = true;
// specify that reader must search for Code39 and Code128 barcodes only
reader.Settings.ScanBarcodeTypes = BarcodeType.Code39 | BarcodeType.Code128;
// read barcodes
IBarcodeInfo[] barcodeInfos = reader.ReadBarcodes(imageWithBarcodes);
// for each found barcode
for (int i = 0; i < barcodeInfos.Length; i++)
{
// test print quality of barcode using ISO 15416 test
ISO15416QualityTest test =
new ISO15416QualityTest((BarcodeInfo1D)barcodeInfos[i], imageWithBarcodes);
// print results of ISO 15416 test
Console.WriteLine(string.Format("[{0}] {1}",
barcodeInfos[i].BarcodeType, barcodeInfos[i].Value));
Console.WriteLine(string.Format("Overall symbol grade: {0} ({1:f2})",
test.OverallSymbolGrade, test.OverallSymbolGradeValue));
if (test.DifferentDecodedValues)
Console.WriteLine("Scan profiles has different barcode decode values!");
if (test.SymbolComponentQualityTests.Length == 1)
{
ISO15416SymbolComponentQualityTest qualityTest = test.SymbolComponentQualityTests[0];
Console.WriteLine(string.Format("Scan reflectance profiles: {0}",
qualityTest.ScanReflectanceProfiles.Length));
Console.WriteLine("Scan reflectance profile grades:");
for (int j = 0; j < qualityTest.ScanReflectanceProfiles.Length; j++)
Console.Write(qualityTest.ScanReflectanceProfiles[j].ScanGrade);
}
else
{
for (int k = 0; k < test.SymbolComponentQualityTests.Length; k++)
{
Console.WriteLine(string.Format("Symbol component: {0}", k + 1));
ISO15416SymbolComponentQualityTest qualityTest = test.SymbolComponentQualityTests[k];
Console.WriteLine(string.Format("Scan reflectance profiles: {0}",
qualityTest.ScanReflectanceProfiles.Length));
Console.WriteLine("Scan reflectance profile grades:");
for (int j = 0; j < qualityTest.ScanReflectanceProfiles.Length; j++)
Console.Write(qualityTest.ScanReflectanceProfiles[j].ScanGrade);
}
}
Console.WriteLine();
Console.WriteLine();
}
}
}
}
Imports Vintasoft.Imaging
Imports Vintasoft.Barcode
Imports Vintasoft.Barcode.BarcodeInfo
Imports Vintasoft.Barcode.QualityTests
''' <summary>
''' Test that shows how to test the print quality of 1D barcodes.
''' </summary>
Class ISO15416QualityTestExample
''' <summary>
''' Runs the test.
''' </summary>
Public Shared Sub Test()
' load image with barcode from file
Using barcodeImage As VintasoftBitmap = ImageCodecs.[Default].Decode("test1.jpg")
' read barcodes from image and test the print quality of 1D barcodes
ReadBarcodesAndTestBarcodePrintQuality(barcodeImage)
End Using
End Sub
''' <summary>
''' Reads barcodes from image and tests the print quality of 1D barcodes.
''' </summary>
Private Shared Sub ReadBarcodesAndTestBarcodePrintQuality(imageWithBarcodes As VintasoftBitmap)
' create the barcode reader
Using reader As New BarcodeReader()
' specify that reader must collect information for quality test
reader.Settings.CollectTestInformation = True
' specify that reader must search for Code39 and Code128 barcodes only
reader.Settings.ScanBarcodeTypes = BarcodeType.Code39 Or BarcodeType.Code128
' read barcodes
Dim barcodeInfos As IBarcodeInfo() = reader.ReadBarcodes(imageWithBarcodes)
' for each found barcode
For i As Integer = 0 To barcodeInfos.Length - 1
' test print quality of barcode using ISO 15416 test
Dim test As New ISO15416QualityTest(DirectCast(barcodeInfos(i), BarcodeInfo1D), imageWithBarcodes)
' print results of ISO 15416 test
Console.WriteLine(String.Format("[{0}] {1}", barcodeInfos(i).BarcodeType, barcodeInfos(i).Value))
Console.WriteLine(String.Format("Overall symbol grade: {0} ({1:f2})", test.OverallSymbolGrade, test.OverallSymbolGradeValue))
If test.DifferentDecodedValues Then
Console.WriteLine("Scan profiles has different barcode decode values!")
End If
If test.SymbolComponentQualityTests.Length = 1 Then
Dim qualityTest As ISO15416SymbolComponentQualityTest = test.SymbolComponentQualityTests(0)
Console.WriteLine(String.Format("Scan reflectance profiles: {0}", qualityTest.ScanReflectanceProfiles.Length))
Console.WriteLine("Scan reflectance profile grades:")
For j As Integer = 0 To qualityTest.ScanReflectanceProfiles.Length - 1
Console.Write(qualityTest.ScanReflectanceProfiles(j).ScanGrade)
Next
Else
For k As Integer = 0 To test.SymbolComponentQualityTests.Length - 1
Console.WriteLine(String.Format("Symbol component: {0}", k + 1))
Dim qualityTest As ISO15416SymbolComponentQualityTest = test.SymbolComponentQualityTests(k)
Console.WriteLine(String.Format("Scan reflectance profiles: {0}", qualityTest.ScanReflectanceProfiles.Length))
Console.WriteLine("Scan reflectance profile grades:")
For j As Integer = 0 To qualityTest.ScanReflectanceProfiles.Length - 1
Console.Write(qualityTest.ScanReflectanceProfiles(j).ScanGrade)
Next
Next
End If
Console.WriteLine()
Console.WriteLine()
Next
End Using
End Sub
End Class
For testing the
print quality of 2D matrix barcodes (Aztec, DataMatrix, Han Xin Code, QR Code, Micro QR Code), it is necessary to use the
ISO15415QualityTest class.
The algorithm of test is based on ISO/IEC 15415. The test allows to evaluate the print quality of barcode using the following parameters:
- Decode - indicates whether the barcode value is decoded successfully
- Max Reflectance (Rmax) - highest reflectance in any element or quiet zone in a scan reflectance profile
- Min Reflectance (Rmin) - lowest reflectance in any element in a scan reflectance profile, in percents of reflectance
- Symbol Contrast (SC) - difference between the highest and lowest reflectance value in the symbol region
- Modulation (MOD) - measure of the uniformity of reflectance of the dark and light modules respectively
- Reflectance Margin - measure of how well each module is correctly distinguishable as light or dark in comparison to the global threshold
- Fixed Pattern Damage - damage of the finder pattern, quiet zone, timing, navigation and other fixed patterns in a symbol
- Axial Nonuniformity - measures the spacing of the mapping centres, i.e. the sampling points, or intersections of the grid obtained by applying the reference decode algorithm to the binarized image, in the direction of each of the grid's major axes
- Grid Nonuniformity - measures the largest vector deviation of the grid intersections, determined by the reference decode algorithm from the binarized image of a given symbol, from their ideal theoretical position
- Unused Error Correction (UEC) - tests the extent to which regional or spot damage in the symbol has eroded the reading safety margin that error correction provides
- Quiet Zone - tests the quiet zone, that requires barcode symboly specification
- Additional Grades - additional grades (depends from barcode symbology, see below)
- Distortion Angle - distortion angle (informative), angle of distortion is the amount of deviation from a 90 (degrees) relation between row and column of barcode matrix, or X and Y axes
Additional grades for
Data Matrix barcode (defined in ISO 16022 Annex M):
- FixedPatternDamage.L1 - grade of segment L1
- FixedPatternDamage.L2 - grade of segment L2
- FixedPatternDamage.QZL1 - grade of segment QZL1
- FixedPatternDamage.QZL2 - grade of segment QZL2
- FixedPatternDamage.Segment_X_Y_Top - grade of top alignment patterns (clock track and solid area) of data region located by specified indexes (X, Y)
- FixedPatternDamage.Segment_X_Y_Right - grade of right alignment patterns (clock track and solid area) of data region located by specified indexes (X, Y)
- FixedPatternDamage.ClockAndSolidArea - grade of all alignment patterns of data regions
- FixedPatternDamage.AG - grade of average grade of L1, L2, QZL1, QZL2, ClockAndSolidArea
Here is an example that shows how to test print quality of 2D matrix barcodes (Aztec, DataMatrix, Han Xin Code, QR Code, Micro QR Code):
using System;
using Vintasoft.Imaging;
using Vintasoft.Barcode;
using Vintasoft.Barcode.BarcodeInfo;
using Vintasoft.Barcode.QualityTests;
/// <summary>
/// Test that shows how to test the print quality of matrix 2D barcodes
/// (Aztec, DataMatrix, QR and MicroQR).
/// </summary>
class ISO15415QualityTestMatrixExample
{
/// <summary>
/// Runs the test.
/// </summary>
public static void Test()
{
// load image with barcode from file
using (VintasoftBitmap barcodeImage = ImageCodecs.Default.Decode("test1.jpg"))
{
// read barcodes from image and test the print quality of 2D barcodes
ReadBarcodesAndTestBarcodePrintQuality(barcodeImage);
}
}
/// <summary>
/// Reads barcodes from image and tests the print quality of 2D barcodes.
/// </summary>
public static void ReadBarcodesAndTestBarcodePrintQuality(VintasoftBitmap imageWithBarcodes)
{
// create the barcode reader
using (BarcodeReader reader = new BarcodeReader())
{
// specify that reader must collect information for quality test
reader.Settings.CollectTestInformation = true;
// specify that reader must search for Aztec, DataMatrix, Han Xin Code, QR and MicroQR barcodes only
reader.Settings.ScanBarcodeTypes =
BarcodeType.Aztec | BarcodeType.DataMatrix |
BarcodeType.QR | BarcodeType.MicroQR | BarcodeType.HanXinCode;
// read barcodes
IBarcodeInfo[] barcodeInfos = reader.ReadBarcodes(imageWithBarcodes);
// for each found barcode
for (int i = 0; i < barcodeInfos.Length; i++)
{
// test print quality of barcode using ISO 15415 test
ISO15415QualityTest test = new ISO15415QualityTest();
test.CalculateGrades((BarcodeInfo2D)barcodeInfos[i], imageWithBarcodes);
// print results of ISO 15415 test
Console.WriteLine(string.Format("[{0}] {1}",
barcodeInfos[i].BarcodeType, barcodeInfos[i].Value));
Console.WriteLine(string.Format("Decode : {0}",
GradeToString(test.DecodeGrade)));
Console.WriteLine(string.Format("Unused error correction : {0} ({1}%)",
GradeToString(test.UnusedErrorCorrectionGrade), test.UnusedErrorCorrection));
Console.WriteLine(string.Format("Symbol contrast : {0} ({1}%)",
GradeToString(test.SymbolContrastGrade), test.SymbolContrast));
Console.WriteLine(string.Format("Axial nonuniformity : {0} ({1})",
GradeToString(test.AxialNonuniformityGrade), test.AxialNonuniformity));
Console.WriteLine(string.Format("Grid nonuniformity : {0} ({1} cell)",
GradeToString(test.GridNonuniformityGrade), test.GridNonuniformity));
Console.WriteLine(string.Format("Modulation : {0}",
GradeToString(test.ModulationGrade)));
Console.WriteLine(string.Format("Reflectance margin : {0}",
GradeToString(test.ReflectanceMarginGrade)));
Console.WriteLine(string.Format("Fixed pattern damage : {0}",
GradeToString(test.FixedPatternDamageGrade)));
foreach (string name in test.AdditionalGrades.Keys)
Console.WriteLine(string.Format("{0}: {1}",
name.PadRight(40, ' '), GradeToString(test.AdditionalGrades[name])));
if (test.QuietZone >= 0)
Console.WriteLine(string.Format("Quiet zone : {0} ({1} %)",
GradeToString(test.QuietZoneGrade), test.QuietZone));
Console.WriteLine(string.Format("Distortion angle (informative) : {0}°",
test.DistortionAngle));
Console.WriteLine(string.Format("-------------Scan grade : {0}",
GradeToString(test.ScanGrade)));
Console.WriteLine();
}
}
}
/// <summary>
/// Converts ISO15415 quality grade into string value.
/// </summary>
static string GradeToString(ISO15415QualityGrade grade)
{
return string.Format("{0}({1})", ((int)grade).ToString(), grade);
}
}
Imports Vintasoft.Imaging
Imports Vintasoft.Barcode
Imports Vintasoft.Barcode.BarcodeInfo
Imports Vintasoft.Barcode.QualityTests
''' <summary>
''' Test that shows how to test the print quality of matrix 2D barcodes
''' (Aztec, DataMatrix, QR and MicroQR).
''' </summary>
Class ISO15415QualityTestMatrixExample
''' <summary>
''' Runs the test.
''' </summary>
Public Shared Sub Test()
' load image with barcode from file
Using barcodeImage As VintasoftBitmap = ImageCodecs.[Default].Decode("test1.jpg")
' read barcodes from image and test the print quality of 2D barcodes
ReadBarcodesAndTestBarcodePrintQuality(barcodeImage)
End Using
End Sub
''' <summary>
''' Reads barcodes from image and tests the print quality of 2D barcodes.
''' </summary>
Public Shared Sub ReadBarcodesAndTestBarcodePrintQuality(imageWithBarcodes As VintasoftBitmap)
' create the barcode reader
Using reader As New BarcodeReader()
' specify that reader must collect information for quality test
reader.Settings.CollectTestInformation = True
' specify that reader must search for Aztec, DataMatrix, Han Xin Code, QR and MicroQR barcodes only
reader.Settings.ScanBarcodeTypes = BarcodeType.Aztec Or BarcodeType.DataMatrix Or BarcodeType.QR Or BarcodeType.MicroQR Or BarcodeType.HanXinCode
' read barcodes
Dim barcodeInfos As IBarcodeInfo() = reader.ReadBarcodes(imageWithBarcodes)
' for each found barcode
For i As Integer = 0 To barcodeInfos.Length - 1
' test print quality of barcode using ISO 15415 test
Dim test As New ISO15415QualityTest()
test.CalculateGrades(DirectCast(barcodeInfos(i), BarcodeInfo2D), imageWithBarcodes)
' print results of ISO 15415 test
Console.WriteLine(String.Format("[{0}] {1}", barcodeInfos(i).BarcodeType, barcodeInfos(i).Value))
Console.WriteLine(String.Format("Decode : {0}", GradeToString(test.DecodeGrade)))
Console.WriteLine(String.Format("Unused error correction : {0} ({1}%)", GradeToString(test.UnusedErrorCorrectionGrade), test.UnusedErrorCorrection))
Console.WriteLine(String.Format("Symbol contrast : {0} ({1}%)", GradeToString(test.SymbolContrastGrade), test.SymbolContrast))
Console.WriteLine(String.Format("Axial nonuniformity : {0} ({1})", GradeToString(test.AxialNonuniformityGrade), test.AxialNonuniformity))
Console.WriteLine(String.Format("Grid nonuniformity : {0} ({1} cell)", GradeToString(test.GridNonuniformityGrade), test.GridNonuniformity))
Console.WriteLine(String.Format("Modulation : {0}", GradeToString(test.ModulationGrade)))
Console.WriteLine(String.Format("Reflectance margin : {0}", GradeToString(test.ReflectanceMarginGrade)))
Console.WriteLine(String.Format("Fixed pattern damage : {0}", GradeToString(test.FixedPatternDamageGrade)))
For Each name As String In test.AdditionalGrades.Keys
Console.WriteLine(String.Format("{0}: {1}", name.PadRight(40, " "C), GradeToString(test.AdditionalGrades(name))))
Next
If test.QuietZone >= 0 Then
Console.WriteLine(String.Format("Quiet zone : {0} ({1} %)", GradeToString(test.QuietZoneGrade), test.QuietZone))
End If
Console.WriteLine(String.Format("Distortion angle (informative) : {0}�", test.DistortionAngle))
Console.WriteLine(String.Format("-------------Scan grade : {0}", GradeToString(test.ScanGrade)))
Console.WriteLine()
Next
End Using
End Sub
''' <summary>
''' Converts ISO15415 quality grade into string value.
''' </summary>
Private Shared Function GradeToString(grade As ISO15415QualityGrade) As String
Return String.Format("{0}({1})", CInt(grade).ToString(), grade)
End Function
End Class
For testing the
print quality of 2D multi-row barcodes with cross-row scanning ability (PDF417, PDF417Compact, MicroPDF417), it is necessary to use the
ISO15415QualityTest class.
The algorithm of test is based on ISO/IEC 15415. The test allows to evaluate the print quality of barcode using the following parameters:
- Decode - indicates whether the barcode value is decoded successfully
- ISO15416 Start/RAP (Raw Address Pattern) pattern test
- ISO15416 Center (RAP) pattern test (MicroPDF417)
- ISO15416 Stop/RAP pattern test
- Unused Error Correction (UEC) - tests the extent to which regional or spot damage in the symbol has eroded the reading safety margin that error correction provides
- Codeword Yield - number of validly decoded codewords expressed as a percentage of the maximum number of codewords, which could have been decoded (after adjusting for tilt)
- Codeword Print Quality
- Quiet Zone - tests the quiet zone, that requires barcode symboly specification
- Distortion Angle - distortion angle (informative), angle of distortion is the amount of deviation from a 90 (degrees) relation between row and column of barcode matrix, or X and Y axes
Here is an example that shows how to test print quality of 2D multi-row barcodes with cross-row scanning ability (PDF417, PDF417Compact, MicroPDF417):
using System;
using Vintasoft.Imaging;
using Vintasoft.Barcode;
using Vintasoft.Barcode.BarcodeInfo;
using Vintasoft.Barcode.QualityTests;
/// <summary>
/// Test that shows how to test the print quality of multi-row 2D barcodes
/// (PDF417, PDF417Compact and MicroPDF417).
/// </summary>
class ISO15415QualityTestMultiRowExample
{
/// <summary>
/// Runs the test.
/// </summary>
public static void Test()
{
// load image with barcode from file
using (VintasoftBitmap barcodeImage = ImageCodecs.Default.Decode("test1.jpg"))
{
// read barcodes from image and test the print quality of 2D barcodes
ReadBarcodesAndTestBarcodePrintQuality(barcodeImage);
}
}
/// <summary>
/// Reads barcodes from image and tests the print quality of 2D barcodes.
/// </summary>
/// <param name="imageWithBarcodes"></param>
public static void ReadBarcodesAndTestBarcodePrintQuality(VintasoftBitmap imageWithBarcodes)
{
// create the barcode reader
using (BarcodeReader reader = new BarcodeReader())
{
// specify that reader must collect information for quality test
reader.Settings.CollectTestInformation = true;
// specify that reader must search for PDF417, PDF417Compact and MicroPDF417 barcodes only
reader.Settings.ScanBarcodeTypes =
BarcodeType.PDF417 | BarcodeType.PDF417Compact | BarcodeType.MicroPDF417;
// read barcodes
IBarcodeInfo[] barcodeInfos = reader.ReadBarcodes(imageWithBarcodes);
// for each found barcode
for (int i = 0; i < barcodeInfos.Length; i++)
{
// test print quality of barcode using ISO 15415 test
ISO15415QualityTest test = new ISO15415QualityTest();
test.CalculateGrades((BarcodeInfo2D)barcodeInfos[i], imageWithBarcodes);
// print results of ISO 15415 test
Console.WriteLine(string.Format("[{0}] {1}",
barcodeInfos[i].BarcodeType, barcodeInfos[i].Value));
Console.WriteLine(string.Format("Decode : {0}",
GradeToString(test.DecodeGrade)));
Console.WriteLine(string.Format("Unused error correction: {0} ({1}%)",
GradeToString(test.UnusedErrorCorrectionGrade), test.UnusedErrorCorrection));
if (test.StartPatternTestGrade != ISO15415QualityGrade.Unavailable)
Console.WriteLine(string.Format("Start pattern test: {0}",
GradeToString(test.StartPatternTestGrade), test.StartPatternTestGrade));
if (test.CenterPatternTestGrade != ISO15415QualityGrade.Unavailable)
Console.WriteLine(string.Format("Center pattern test: {0}",
GradeToString(test.CenterPatternTestGrade), test.CenterPatternTest));
if (test.CenterPatternTestGrade != ISO15415QualityGrade.Unavailable)
Console.WriteLine(string.Format("Stop pattern test: {0}",
GradeToString(test.CenterPatternTestGrade), test.CenterPatternTestGrade));
Console.WriteLine(string.Format("Codeword yield: {0}",
GradeToString(test.CodewordYieldGrade), test.CodewordYieldGrade));
Console.WriteLine(string.Format("Codeword print quality: {0}",
GradeToString(test.CodewordPrintQualityGrade), test.CodewordPrintQualityGrade));
if (test.QuietZone >= 0)
Console.WriteLine(string.Format("Quiet zone: {0} ({1} %)",
GradeToString(test.QuietZoneGrade), test.QuietZone));
Console.WriteLine(string.Format("Distortion angle: {0}°",
test.DistortionAngle));
Console.WriteLine(string.Format("-------------Scan grade: {0}",
GradeToString(test.ScanGrade)));
Console.WriteLine();
}
}
}
/// <summary>
/// Converts ISO15415 quality grade into string value.
/// </summary>
static string GradeToString(ISO15415QualityGrade grade)
{
return string.Format("{0}({1})", ((int)grade).ToString(), grade);
}
}
Imports Vintasoft.Imaging
Imports Vintasoft.Barcode
Imports Vintasoft.Barcode.BarcodeInfo
Imports Vintasoft.Barcode.QualityTests
''' <summary>
''' Test that shows how to test the print quality of multi-row 2D barcodes
''' (PDF417, PDF417Compact and MicroPDF417).
''' </summary>
Class ISO15415QualityTestMultiRowExample
''' <summary>
''' Runs the test.
''' </summary>
Public Shared Sub Test()
' load image with barcode from file
Using barcodeImage As VintasoftBitmap = ImageCodecs.[Default].Decode("test1.jpg")
' read barcodes from image and test the print quality of 2D barcodes
ReadBarcodesAndTestBarcodePrintQuality(barcodeImage)
End Using
End Sub
''' <summary>
''' Reads barcodes from image and tests the print quality of 2D barcodes.
''' </summary>
''' <param name="imageWithBarcodes"></param>
Public Shared Sub ReadBarcodesAndTestBarcodePrintQuality(imageWithBarcodes As VintasoftBitmap)
' create the barcode reader
Using reader As New BarcodeReader()
' specify that reader must collect information for quality test
reader.Settings.CollectTestInformation = True
' specify that reader must search for PDF417, PDF417Compact and MicroPDF417 barcodes only
reader.Settings.ScanBarcodeTypes = BarcodeType.PDF417 Or BarcodeType.PDF417Compact Or BarcodeType.MicroPDF417
' read barcodes
Dim barcodeInfos As IBarcodeInfo() = reader.ReadBarcodes(imageWithBarcodes)
' for each found barcode
For i As Integer = 0 To barcodeInfos.Length - 1
' test print quality of barcode using ISO 15415 test
Dim test As New ISO15415QualityTest()
test.CalculateGrades(DirectCast(barcodeInfos(i), BarcodeInfo2D), imageWithBarcodes)
' print results of ISO 15415 test
Console.WriteLine(String.Format("[{0}] {1}", barcodeInfos(i).BarcodeType, barcodeInfos(i).Value))
Console.WriteLine(String.Format("Decode : {0}", GradeToString(test.DecodeGrade)))
Console.WriteLine(String.Format("Unused error correction: {0} ({1}%)", GradeToString(test.UnusedErrorCorrectionGrade), test.UnusedErrorCorrection))
If test.StartPatternTestGrade <> ISO15415QualityGrade.Unavailable Then
Console.WriteLine(String.Format("Start pattern test: {0}", GradeToString(test.StartPatternTestGrade), test.StartPatternTestGrade))
End If
If test.CenterPatternTestGrade <> ISO15415QualityGrade.Unavailable Then
Console.WriteLine(String.Format("Center pattern test: {0}", GradeToString(test.CenterPatternTestGrade), test.CenterPatternTest))
End If
If test.CenterPatternTestGrade <> ISO15415QualityGrade.Unavailable Then
Console.WriteLine(String.Format("Stop pattern test: {0}", GradeToString(test.CenterPatternTestGrade), test.CenterPatternTestGrade))
End If
Console.WriteLine(String.Format("Codeword yield: {0}", GradeToString(test.CodewordYieldGrade), test.CodewordYieldGrade))
Console.WriteLine(String.Format("Codeword print quality: {0}", GradeToString(test.CodewordPrintQualityGrade), test.CodewordPrintQualityGrade))
If test.QuietZone >= 0 Then
Console.WriteLine(String.Format("Quiet zone: {0} ({1} %)", GradeToString(test.QuietZoneGrade), test.QuietZone))
End If
Console.WriteLine(String.Format("Distortion angle: {0}�", test.DistortionAngle))
Console.WriteLine(String.Format("-------------Scan grade: {0}", GradeToString(test.ScanGrade)))
Console.WriteLine()
Next
End Using
End Sub
''' <summary>
''' Converts ISO15415 quality grade into string value.
''' </summary>
Private Shared Function GradeToString(grade As ISO15415QualityGrade) As String
Return String.Format("{0}({1})", CInt(grade).ToString(), grade)
End Function
End Class