Generate and recognize Han Xin Code barcodes in .NET
May 4, 2020


/// <summary>
/// Generates Han Xin Code barcode as raster image.
/// </summary>
public void GenerateHanXinCodeBarcodeAsRasterImage()
{
// create the barcode writer
Vintasoft.Barcode.BarcodeWriter barcodeWriter = new Vintasoft.Barcode.BarcodeWriter();
// set barcode writer settings
barcodeWriter.Settings.Barcode = Vintasoft.Barcode.BarcodeType.HanXinCode;
barcodeWriter.Settings.Value = "012345abcde";
// get a barcode image
using (System.Drawing.Image image = barcodeWriter.GetBarcodeAsBitmap())
{
// save the barcode image to a file
image.Save("HanXinCodeBarcode.png");
}
}
/// <summary>
/// Generates Han Xin Code barcode as graphics path.
/// </summary>
public System.Drawing.Drawing2D.GraphicsPath GenerateHanXinCodeBarcodeAsGraphicsPath()
{
// create the barcode writer
Vintasoft.Barcode.BarcodeWriter barcodeWriter = new Vintasoft.Barcode.BarcodeWriter();
// set barcode writer settings
barcodeWriter.Settings.Barcode = Vintasoft.Barcode.BarcodeType.HanXinCode;
barcodeWriter.Settings.Value = "012345abcde";
// return barcode as graphics path
return barcodeWriter.GetBarcodeAsGraphicsPath();
}
/// <summary>
/// Generates Han Xin Code barcode as SVG image.
/// </summary>
public string GenerateHanXinCodeBarcodeAsSvgImage()
{
// create the barcode writer
Vintasoft.Barcode.BarcodeWriter barcodeWriter = new Vintasoft.Barcode.BarcodeWriter();
// set barcode writer settings
barcodeWriter.Settings.Barcode = Vintasoft.Barcode.BarcodeType.HanXinCode;
barcodeWriter.Settings.Value = "012345abcde";
// return barcode as SVG image
return barcodeWriter.GetBarcodeAsSvgFile();
}
/// <summary>
/// Recognizes Han Xin Code barcode in image.
/// </summary>
public void RecognizeHanXinCodeBarcode()
{
// create barcode reader
using (Vintasoft.Barcode.BarcodeReader reader = new Vintasoft.Barcode.BarcodeReader())
{
// specify that reader must search for Han Xin Code barcodes
reader.Settings.ScanBarcodeTypes = Vintasoft.Barcode.BarcodeType.HanXinCode;
// specify that reader must search for horizontal and vertical barcodes only
reader.Settings.ScanDirection = Vintasoft.Barcode.ScanDirection.Horizontal | Vintasoft.Barcode.ScanDirection.Vertical;
// read barcodes from image file
Vintasoft.Barcode.IBarcodeInfo[] barcodeInfos = reader.ReadBarcodes("HanXinCodeBarcode.png");
// if barcodes are not detected
if (barcodeInfos.Length == 0)
{
Console.WriteLine("Barcodes are not found.");
}
// if barcodes are detected
else
{
// get information about recognized barcodes
Console.WriteLine(string.Format("{0} barcode(s) found:", barcodeInfos.Length));
Console.WriteLine();
for (int i = 0; i < barcodeInfos.Length; i++)
{
Vintasoft.Barcode.IBarcodeInfo barcodeInfo = barcodeInfos[i];
Console.WriteLine(string.Format("[{0}:{1}]", i + 1, barcodeInfo.BarcodeType));
Console.WriteLine(string.Format("Value: {0}", barcodeInfo.Value));
Console.WriteLine(string.Format("Region: {0}", barcodeInfo.Region));
Console.WriteLine();
}
}
}
}
/// <summary>
/// Recognizes and prints quality of Han Xin Code barcode in image.
/// </summary>
public void ReadBarcodesAndTestBarcodePrintQuality()
{
// load image with barcode from file
using (System.Drawing.Image barcodeImage = System.Drawing.Image.FromFile("HanXinCodeBarcode.png"))
{
// create the barcode reader
using (Vintasoft.Barcode.BarcodeReader reader = new Vintasoft.Barcode.BarcodeReader())
{
// specify that reader must search for Han Xin Code barcodes
reader.Settings.ScanBarcodeTypes = Vintasoft.Barcode.BarcodeType.HanXinCode;
// specify that reader must collect information for quality test
reader.Settings.CollectTestInformation = true;
// read barcodes
Vintasoft.Barcode.IBarcodeInfo[] barcodeInfos = reader.ReadBarcodes(barcodeImage);
// for each found barcode
for (int i = 0; i < barcodeInfos.Length; i++)
{
Vintasoft.Barcode.IBarcodeInfo barcodeInfo = barcodeInfos[i];
// print information about recognized barcode
Console.WriteLine(string.Format("[{0}:{1}]", i + 1, barcodeInfo.BarcodeType));
Console.WriteLine(string.Format("Value: {0}", barcodeInfo.Value));
Console.WriteLine(string.Format("Region: {0}", barcodeInfo.Region));
// test barcode print quality in accordance with ISO 15415
Vintasoft.Barcode.QualityTests.ISO15415QualityTest test = new Vintasoft.Barcode.QualityTests.ISO15415QualityTest();
test.CalculateGrades((Vintasoft.Barcode.BarcodeInfo.BarcodeInfo2D)barcodeInfo, barcodeImage);
// print results of barcode print quality test
Console.WriteLine("ISO15415 print quality test:");
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)));
Console.WriteLine(string.Format("- Distortion angle (informative) : {0}°", test.DistortionAngle));
Console.WriteLine();
}
}
}
}
/// <summary>
/// Converts ISO15415 quality grade into string value.
/// </summary>
static string GradeToString(Vintasoft.Barcode.QualityTests.ISO15415QualityGrade grade)
{
int gradeAsInt = (int)grade;
return string.Format("{0}({1})", gradeAsInt, grade);
}
