Générer et reconnaître des codes-barres Han Xin en .NET

Catégorie du blog: Code-barres.NET

04.05.2020

Le code Han Xin est une symbologie matricielle bidimensionnelle, composée d'un ensemble de modules approximativement carrés disposés selon un motif carré global.
Samples of Han Xin Code barcodes

La matrice de code-barres Han Xin Code comporte quatre motifs de recherche (A1 à A4) positionnés sur les bords du code-barres. Elle inclut également des motifs d'alignement (B) internes permettant la reconnaissance de codes-barres présentant diverses distorsions, dues par exemple à des imperfections lors de la prise de vue ou à des irrégularités de la surface d'impression ou d'étiquetage.

Structure of Han Xin Code barcode


Le code-barres Han Xin Code possède une particularité: il peut stocker des données textuelles encodées au format GB18030 (symboles de 2 et 4 octets) de manière très compacte.

Caractéristiques générales du code Han Xin:


VintaSoft Barcode .NET SDK prend en charge la lecture, l'écriture et le test de qualité d'impression des codes-barres Han Xin Code (code sensible chinois).

Voici un code C# qui montre comment générer un code-barres Han Xin sous forme d'image raster:
/// <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");
    }
}


Voici un code C# qui montre comment générer un code-barres Han Xin au format vectoriel:
/// <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();
}


Voici un code C# qui montre comment générer un code-barres Han Xin au format SVG:
/// <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();
}

Voici un code C# qui montre comment reconnaître un code-barres Han Xin dans une image:
/// <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 &lt; 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();
            }
        }
    }
}

Voici un code C# qui montre comment reconnaître et tester la qualité d'impression d'un code-barres Han Xin dans une image:
/// <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 &lt; 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);
}

Voici une capture d'écran de la démo VintaSoft Barcode qui montre le résultat du test de qualité d'impression ISO/IEC 15415 pour le code-barres Han Xin Code:
Result of ISO/IEC 15415 print quality test for Han Xin Code barcode