VintaSoft Barcode .NET SDK 16.0: Documentation for .NET developer
In This Topic
Quiet zone around barcode
In This Topic

Quiet zone around barcode

The quiet zone around barcode is the free zone (usually of white color) around the barcode. The quiet zone is required for correct recognition of barcode search pattern when recognizing barcode. Violation of the quiet zone may result in slow barcode recognition or inability to recognize the barcode by some barcode scanners. The quiet zone is specified in unit modules (X): the width of a single bar of 1D barcode or the size of a cell of 2D barcode.

Here is an example of barcode images with broken quiet zone:


Requirements for quiet zone

The requirements for quiet zone are defined in the barcode symbology specification.

The requirements for the quiet zone for 2D barcodes are defined as the zone width around the barcode:
  1. DataMatrix - 1X
  2. QR Code - 4X
  3. Micro QR Code - 2X
  4. PDF417 - 2X
  5. PDF417 Compact - 2X
  6. Micro PDF417 - 1X
  7. Han Xin Code - 3X
  8. Aztec - 0X (the quiet zone is not necessary)
The requirements for the quiet zone for 1D barcodes are defined as the indentation on the right and left sides of the barcode:
  1. Matrix2of5 - left, right: 10X
  2. IATA2of5 - left, right: 10X
  3. Standard2of5 - left, right: 10X
  4. Interleaved2of5 - left, right: 10X
  5. Code128 - left, right: 10X
  6. EAN13 - left: 11X, right: 7X
  7. EAN8 - left, right: 7X
  8. UPCE - left: 9X, right: 7X
  9. UPCA - left, right: 9X


Testing the quiet zone when performing the 2D barcode print quality test using ISO 15415

The quiet zone for 2D barcode can be tested using the ISO15415 barcode print quality test - ISO15415QualityTest.
The size of quiet zone for recognized 2D barcode can be got using the QuietZone property. The quiet zone value is returned as a percent from the required quiet zone.
Here is C#/VB.NET code that demonstrates how to get the quiet zone size for 2D barcode:
using System;
using Vintasoft.Barcode;
using Vintasoft.Barcode.QualityTests;

public class ISO15415QualityTestQuietZoneExample
{
    /// <summary>
    /// Prints the information about quiet zone of 2D barcode.
    /// </summary>
    /// <param name="filename">The filename.</param>
    /// <param name="barcodeType">Type of the barcode.</param>
    public static void PrintQuietZoneInfo2D(string filename, BarcodeType barcodeType)
    {
        using (QualityTestManager qualityTestManager = new QualityTestManager(barcodeType))
        {
            // recognize barcodes and execute testing for recognized barcodes
            qualityTestManager.ExecuteTesting(filename);
            // for each recognized barcode
            foreach (ISO15415QualityTest qualityTest in qualityTestManager.ISO15415Results)
            {
                // print the quality test information
                Console.WriteLine("Barcode Type:        {0}", qualityTest.BarcodeInfo.BarcodeType);
                Console.WriteLine("Required Quiet Zone: {0}X", qualityTest.QuietZoneSize);
                Console.WriteLine("Barcode value:       {0}", qualityTest.BarcodeInfo.Value);
                Console.WriteLine("Quiet Zone:          {0}%", Math.Round(qualityTest.QuietZone.Value, 1));
            }
        }
    }
}

Imports Vintasoft.Barcode
Imports Vintasoft.Barcode.QualityTests

Public Class ISO15415QualityTestQuietZoneExample
    ''' <summary>
    ''' Prints the information about quiet zone of 2D barcode.
    ''' </summary>
    ''' <param name="filename">The filename.</param>
    ''' <param name="barcodeType">Type of the barcode.</param>
    Public Shared Sub PrintQuietZoneInfo2D(filename As String, barcodeType As BarcodeType)
        Using qualityTestManager As New QualityTestManager(barcodeType)
            ' recognize barcodes and execute testing for recognized barcodes
            qualityTestManager.ExecuteTesting(filename)
            ' for each recognized barcode
            For Each qualityTest As ISO15415QualityTest In qualityTestManager.ISO15415Results
                ' print the quality test information
                Console.WriteLine("Barcode Type:        {0}", qualityTest.BarcodeInfo.BarcodeType)
                Console.WriteLine("Required Quiet Zone: {0}X", qualityTest.QuietZoneSize)
                Console.WriteLine("Barcode value:       {0}", qualityTest.BarcodeInfo.Value)
                Console.WriteLine("Quiet Zone:          {0}%", Math.Round(qualityTest.QuietZone.Value, 1))
            Next
        End Using
    End Sub
End Class



Setting the requered quiet zone when performing the 2D barcode print quality test using ISO 15415

If barcode print quality test should use user-defined value of quiet zone, the required quiet zone for ISO 15415 barcode print quality test can be set using the SetQuietZoneSize method.
Here is C#/VB.NET code that demonstrates how to set the user-defined size of quiet zone when performing the 2D barcode print quality test using ISO 15415:
using System;
using Vintasoft.Barcode;
using Vintasoft.Barcode.QualityTests;

public class ISO15415QualityTestSetQuietZoneExample
{
    /// <summary>
    /// Sets required quiet zone and prints the information about quiet zone of 2D barcode.
    /// </summary>
    /// <param name="filename">The filename.</param>
    /// <param name="barcodeType">Type of the barcode.</param>
    /// <param name="requiredQuietZoneSize">The size of quiet zone, measured in single modules.</param>
    public static void SetRequiredQuietZoneAndPrintQuietZoneInfo2D(string filename, BarcodeType barcodeType, int requiredQuietZoneSize)
    {
        using (QualityTestManager qualityTestManager = new QualityTestManager(barcodeType))
        {
            // set the required quiet zone
            qualityTestManager.ISO15415Settings.SetQuietZoneSize(barcodeType, requiredQuietZoneSize);
            // recognize barcodes and execute testing for recognized barcodes
            qualityTestManager.ExecuteTesting(filename);
            // for each recognized barcode
            foreach (ISO15415QualityTest qualityTest in qualityTestManager.ISO15415Results)
            {
                // print the quality test information
                Console.WriteLine("Barcode Type:        {0}", qualityTest.BarcodeInfo.BarcodeType);
                Console.WriteLine("Required Quiet Zone: {0}X", qualityTest.QuietZoneSize);
                Console.WriteLine("Barcode value:       {0}", qualityTest.BarcodeInfo.Value);
                Console.WriteLine("Quiet Zone:          {0}%", Math.Round(qualityTest.QuietZone.Value, 1));
            }
        }
    }
}

Imports Vintasoft.Barcode
Imports Vintasoft.Barcode.QualityTests

Public Class ISO15415QualityTestSetQuietZoneExample
    ''' <summary>
    ''' Sets required quiet zone and prints the information about quiet zone of 2D barcode.
    ''' </summary>
    ''' <param name="filename">The filename.</param>
    ''' <param name="barcodeType">Type of the barcode.</param>
    ''' <param name="requiredQuietZoneSize">The size of quiet zone, measured in single modules.</param>
    Public Shared Sub SetRequiredQuietZoneAndPrintQuietZoneInfo2D(filename As String, barcodeType As BarcodeType, requiredQuietZoneSize As Integer)
        Using qualityTestManager As New QualityTestManager(barcodeType)
            ' set the required quiet zone
            qualityTestManager.ISO15415Settings.SetQuietZoneSize(barcodeType, requiredQuietZoneSize)
            ' recognize barcodes and execute testing for recognized barcodes
            qualityTestManager.ExecuteTesting(filename)
            ' for each recognized barcode
            For Each qualityTest As ISO15415QualityTest In qualityTestManager.ISO15415Results
                ' print the quality test information
                Console.WriteLine("Barcode Type:        {0}", qualityTest.BarcodeInfo.BarcodeType)
                Console.WriteLine("Required Quiet Zone: {0}X", qualityTest.QuietZoneSize)
                Console.WriteLine("Barcode value:       {0}", qualityTest.BarcodeInfo.Value)
                Console.WriteLine("Quiet Zone:          {0}%", Math.Round(qualityTest.QuietZone.Value, 1))
            Next
        End Using
    End Sub
End Class



Testing the quiet zone when performing the 1D barcode print quality test using ISO 15416

The quiet zone for 1D barcode can be tested using the ISO15415 barcode print quality test - ISO15416QualityTest.
The size of quiet zone for recognized 1D barcode can be got using the properties QuietZoneLeft and QuietZoneRight. The quiet zone value is returned as a percent from the required quiet zone.
Here is C#/VB.NET code that demonstrates how to get the quiet zone size for 1D barcode:
using System;
using Vintasoft.Barcode;
using Vintasoft.Barcode.QualityTests;

public class ISO15416QualityTestQuietZoneExample
{
    /// <summary>
    /// Prints the information about quiet zone of 1D barcode.
    /// </summary>
    /// <param name="filename">The filename.</param>
    /// <param name="barcodeType">Type of the barcode.</param>
    public static void PrintQuietZoneInfo1D(string filename, BarcodeType barcodeType)
    {
        using (QualityTestManager qualityTestManager = new QualityTestManager(barcodeType))
        {
            // recognize barcodes and execute testing for recognized barcodes
            qualityTestManager.ExecuteTesting(filename);
            // for each recognized barcode
            foreach (ISO15416QualityTest qualityTest in qualityTestManager.ISO15416Results)
            {
                // print the quality test information
                Console.WriteLine("Barcode Type:        {0}", qualityTest.BarcodeInfo.BarcodeType);
                Console.WriteLine("Required Quiet Zone: Left - {0}X, Right - {1}X", qualityTest.TestSettings.LeftQuietZone, qualityTest.TestSettings.RightQuietZone);
                Console.WriteLine("Barcode value:       {0}", qualityTest.BarcodeInfo.Value);                
                // average grade values of ISO15416SymbolComponentQualityTest.ScanReflectanceProfiles
                ISO15416ScanReflectanceProfile avgProfile = qualityTest.SymbolComponentQualityTests[0].AverageScanReflectanceProfileValues;
                Console.WriteLine("Quiet Zone Left:     {0}%", Math.Round(avgProfile.QuietZoneLeft.Value, 1));
                Console.WriteLine("Quiet Zone Right:    {0}%", Math.Round(avgProfile.QuietZoneRight.Value, 1));
            }
        }
    }
}

Imports Vintasoft.Barcode
Imports Vintasoft.Barcode.QualityTests

Public Class ISO15416QualityTestQuietZoneExample
    ''' <summary>
    ''' Prints the information about quiet zone of 1D barcode.
    ''' </summary>
    ''' <param name="filename">The filename.</param>
    ''' <param name="barcodeType">Type of the barcode.</param>
    Public Shared Sub PrintQuietZoneInfo1D(filename As String, barcodeType As BarcodeType)
        Using qualityTestManager As New QualityTestManager(barcodeType)
            ' recognize barcodes and execute testing for recognized barcodes
            qualityTestManager.ExecuteTesting(filename)
            ' for each recognized barcode
            For Each qualityTest As ISO15416QualityTest In qualityTestManager.ISO15416Results
                ' print the quality test information
                Console.WriteLine("Barcode Type:        {0}", qualityTest.BarcodeInfo.BarcodeType)
                Console.WriteLine("Required Quiet Zone: Left - {0}X, Right - {1}X", qualityTest.TestSettings.LeftQuietZone, qualityTest.TestSettings.RightQuietZone)
                Console.WriteLine("Barcode value:       {0}", qualityTest.BarcodeInfo.Value)
                ' average grade values of ISO15416SymbolComponentQualityTest.ScanReflectanceProfiles
                Dim avgProfile As ISO15416ScanReflectanceProfile = qualityTest.SymbolComponentQualityTests(0).AverageScanReflectanceProfileValues
                Console.WriteLine("Quiet Zone Left:     {0}%", Math.Round(avgProfile.QuietZoneLeft.Value, 1))
                Console.WriteLine("Quiet Zone Right:    {0}%", Math.Round(avgProfile.QuietZoneRight.Value, 1))
            Next
        End Using
    End Sub
End Class



Setting the requered quiet zone when performing the 1D barcode print quality test using ISO 15416

If barcode print quality test should use user-defined value of quiet zone, the required quiet zone for ISO 15415 barcode print quality test can be set using the properties LeftQuietZone and RightQuietZone.
Here is C#/VB.NET code that demonstrates how to set the user-defined size of quiet zone when performing the 1D barcode print quality test using ISO 15416:
using System;
using Vintasoft.Barcode;
using Vintasoft.Barcode.BarcodeInfo;
using Vintasoft.Barcode.QualityTests;

public class ISO15416QualityTestSetQuietZoneExample
{
    /// <summary>
    /// Sets required quiet zone and prints the information about quiet zone of 1D barcode.
    /// </summary>
    /// <param name="filename">The filename.</param>
    /// <param name="barcodeType">Type of the barcode.</param>
    /// <param name="requiredQuietZoneSizeLeft">The left quiet zone, measured in narrow bars.</param>
    /// <param name="requiredQuietZoneSizeRight">The right quiet zone, measured in narrow bars.</param>
    public static void SetRequiredQuietZoneAndPrintQuietZoneInfo1D(string filename, BarcodeType barcodeType, int requiredQuietZoneSizeLeft, int requiredQuietZoneSizeRight)
    {
        // create MyQualityTestManager that sets required quiet zone
        using (MyQualityTestManager qualityTestManager = new MyQualityTestManager(barcodeType, requiredQuietZoneSizeLeft, requiredQuietZoneSizeRight))
        {
            // recognize barcodes and execute testing for recognized barcodes
            qualityTestManager.ExecuteTesting(filename);
            // for each recognized barcode
            foreach (ISO15416QualityTest qualityTest in qualityTestManager.ISO15416Results)
            {
                // print the quality test information
                Console.WriteLine("Barcode Type:        {0}", qualityTest.BarcodeInfo.BarcodeType);
                Console.WriteLine("Required Quiet Zone: Left - {0}X, Right - {1}X", qualityTest.TestSettings.LeftQuietZone, qualityTest.TestSettings.RightQuietZone);
                Console.WriteLine("Barcode value:       {0}", qualityTest.BarcodeInfo.Value);
                // average grade values of ISO15416SymbolComponentQualityTest.ScanReflectanceProfiles
                ISO15416ScanReflectanceProfile avgProfile = qualityTest.SymbolComponentQualityTests[0].AverageScanReflectanceProfileValues;
                Console.WriteLine("Quiet Zone Left:     {0}%", Math.Round(avgProfile.QuietZoneLeft.Value, 1));
                Console.WriteLine("Quiet Zone Right:    {0}%", Math.Round(avgProfile.QuietZoneRight.Value, 1));
            }
        }
    }

    /// <summary>
    /// Quality test manager with ability to set the required quiet zone of 1D barcodes.
    /// </summary>
    public class MyQualityTestManager : QualityTestManager
    {
        int _requiredQuietZoneSizeLeft;
        int _requiredQuietZoneSizeRight;

        /// <summary>
        /// Initializes a new instance of the <see cref="MyQualityTestManager"/> class.
        /// </summary>
        /// <param name="barcodeType">Type of the barcode.</param>
        /// <param name="requiredQuietZoneSizeLeft">The left quiet zone, measured in narrow bars.</param>
        /// <param name="requiredQuietZoneSizeRight">The right quiet zone, measured in narrow bars.</param>
        public MyQualityTestManager(BarcodeType barcodeType, int requiredQuietZoneSizeLeft, int requiredQuietZoneSizeRight) 
            : base(barcodeType)
        {
            _requiredQuietZoneSizeLeft = requiredQuietZoneSizeLeft;
            _requiredQuietZoneSizeRight = requiredQuietZoneSizeRight;
        }

        /// <summary>
        /// Creates the ISO15416 quality test settings.
        /// </summary>
        /// <param name="barcodeInfo">The barcode information.</param>
        /// <returns>
        /// A new instance of <see cref="T:Vintasoft.Barcode.QualityTests.ISO15416QualityTestSettings" /> class.
        /// </returns>
        protected override ISO15416QualityTestSettings CreateISO15416QualityTestSettings(BarcodeInfo1D barcodeInfo)
        {
            ISO15416QualityTestSettings result =  base.CreateISO15416QualityTestSettings(barcodeInfo);
            // set the required quiet zone
            result.LeftQuietZone = _requiredQuietZoneSizeLeft;
            result.RightQuietZone = _requiredQuietZoneSizeRight;
            return result;
        }
    }
}

Imports Vintasoft.Barcode
Imports Vintasoft.Barcode.BarcodeInfo
Imports Vintasoft.Barcode.QualityTests

Public Class ISO15416QualityTestSetQuietZoneExample
    ''' <summary>
    ''' Sets required quiet zone and prints the information about quiet zone of 1D barcode.
    ''' </summary>
    ''' <param name="filename">The filename.</param>
    ''' <param name="barcodeType">Type of the barcode.</param>
    ''' <param name="requiredQuietZoneSizeLeft">The left quiet zone, measured in narrow bars.</param>
    ''' <param name="requiredQuietZoneSizeRight">The right quiet zone, measured in narrow bars.</param>
    Public Shared Sub SetRequiredQuietZoneAndPrintQuietZoneInfo1D(filename As String, barcodeType As BarcodeType, requiredQuietZoneSizeLeft As Integer, requiredQuietZoneSizeRight As Integer)
        ' create MyQualityTestManager that sets required quiet zone
        Using qualityTestManager As New MyQualityTestManager(barcodeType, requiredQuietZoneSizeLeft, requiredQuietZoneSizeRight)
            ' recognize barcodes and execute testing for recognized barcodes
            qualityTestManager.ExecuteTesting(filename)
            ' for each recognized barcode
            For Each qualityTest As ISO15416QualityTest In qualityTestManager.ISO15416Results
                ' print the quality test information
                Console.WriteLine("Barcode Type:        {0}", qualityTest.BarcodeInfo.BarcodeType)
                Console.WriteLine("Required Quiet Zone: Left - {0}X, Right - {1}X", qualityTest.TestSettings.LeftQuietZone, qualityTest.TestSettings.RightQuietZone)
                Console.WriteLine("Barcode value:       {0}", qualityTest.BarcodeInfo.Value)
                ' average grade values of ISO15416SymbolComponentQualityTest.ScanReflectanceProfiles
                Dim avgProfile As ISO15416ScanReflectanceProfile = qualityTest.SymbolComponentQualityTests(0).AverageScanReflectanceProfileValues
                Console.WriteLine("Quiet Zone Left:     {0}%", Math.Round(avgProfile.QuietZoneLeft.Value, 1))
                Console.WriteLine("Quiet Zone Right:    {0}%", Math.Round(avgProfile.QuietZoneRight.Value, 1))
            Next
        End Using
    End Sub

    ''' <summary>
    ''' Quality test manager with ability to set the required quiet zone of 1D barcodes.
    ''' </summary>
    Public Class MyQualityTestManager
        Inherits QualityTestManager
        Private _requiredQuietZoneSizeLeft As Integer
        Private _requiredQuietZoneSizeRight As Integer

        ''' <summary>
        ''' Initializes a new instance of the <see cref="MyQualityTestManager"/> class.
        ''' </summary>
        ''' <param name="barcodeType">Type of the barcode.</param>
        ''' <param name="requiredQuietZoneSizeLeft">The left quiet zone, measured in narrow bars.</param>
        ''' <param name="requiredQuietZoneSizeRight">The right quiet zone, measured in narrow bars.</param>
        Public Sub New(barcodeType As BarcodeType, requiredQuietZoneSizeLeft As Integer, requiredQuietZoneSizeRight As Integer)
            MyBase.New(barcodeType)
            _requiredQuietZoneSizeLeft = requiredQuietZoneSizeLeft
            _requiredQuietZoneSizeRight = requiredQuietZoneSizeRight
        End Sub

        ''' <summary>
        ''' Creates the ISO15416 quality test settings.
        ''' </summary>
        ''' <param name="barcodeInfo">The barcode information.</param>
        ''' <returns>
        ''' A new instance of <see cref="T:Vintasoft.Barcode.QualityTests.ISO15416QualityTestSettings" /> class.
        ''' </returns>
        Protected Overrides Function CreateISO15416QualityTestSettings(barcodeInfo As BarcodeInfo1D) As ISO15416QualityTestSettings
            Dim result As ISO15416QualityTestSettings = MyBase.CreateISO15416QualityTestSettings(barcodeInfo)
            ' set the required quiet zone
            result.LeftQuietZone = _requiredQuietZoneSizeLeft
            result.RightQuietZone = _requiredQuietZoneSizeRight
            Return result
        End Function
    End Class
End Class



How to determine on which side the quiet zone of 2D barcode is violated?

If it is necessary to determine on which side the quiet zone of 2D barcode is violated, the modulation matrix of 2D barcode should be analyzed - ModulationMatrix.
Here is an image that displays the modulation matrix for QR Code barcode with violation in the quiet zone around barcode:


Here is C#/VB.NET code that demonstrates how to check the violation of quiet zone for left/right/top/bottom sides of 2D barcode:
using System;
using Vintasoft.Barcode;
using Vintasoft.Barcode.QualityTests;

public class ISO15415QualityTestQuietZoneModulationMatrix
{ 
    /// <summary>
    /// Prints the information about left, right, top and bottom quiet zone of 2D barcode.
    /// </summary>
    /// <param name="filename">The filename.</param>
    /// <param name="barcodeType">Type of the barcode.</param>
    public static void PrintLRTBQuietZoneInfo2D(string filename, BarcodeType barcodeType)
    {
        using (QualityTestManager qualityTestManager = new QualityTestManager(barcodeType))
        {
            // recognize barcodes and execute testing for recognized barcodes
            qualityTestManager.ExecuteTesting(filename);
            // for each recognized barcode
            foreach (ISO15415QualityTest qualityTest in qualityTestManager.ISO15415Results)
            {
                // print the quality test information
                Console.WriteLine("Barcode Type:        {0}", qualityTest.BarcodeInfo.BarcodeType);
                Console.WriteLine("Required Quiet Zone: {0}X", qualityTest.QuietZoneSize);
                Console.WriteLine("Barcode value:       {0}", qualityTest.BarcodeInfo.Value);
                Console.WriteLine("Quiet Zone Left:     {0}%", Math.Round(GetQuietZoneLeft(qualityTest), 1));
                Console.WriteLine("Quiet Zone Right:    {0}%", Math.Round(GetQuietZoneRight(qualityTest), 1));
                Console.WriteLine("Quiet Zone Top:      {0}%", Math.Round(GetQuietZoneTop(qualityTest), 1));
                Console.WriteLine("Quiet Zone Bottom:   {0}%", Math.Round(GetQuietZoneBottom(qualityTest), 1));
            }
        }
    }

    /// <summary>
    /// Returns the bottom quiet zone in percents.
    /// </summary>
    /// <param name="qualityTest">The quality test.</param>
    private static double GetQuietZoneBottom(ISO15415QualityTest qualityTest)
    {
        int quietZoneSize = (int)qualityTest.QuietZoneSize;
        float[,] modulationMatrix = qualityTest.ModulationMatrix;
        int matrixHeight = modulationMatrix.GetLength(0);
        int matrixWidth = modulationMatrix.GetLength(1);
        int badModulationCount = 0;
        for (int y = matrixHeight - quietZoneSize; y < matrixHeight; y++)
        {
            for (int x = 0; x < matrixWidth; x++)
            {
                if (Math.Abs(modulationMatrix[y, x]) < 0.175)
                    badModulationCount++;
            }
        }
        return GetPercent(badModulationCount, quietZoneSize * matrixWidth);
    }

    /// <summary>
    /// Returns the top quiet zone in percents.
    /// </summary>
    /// <param name="qualityTest">The quality test.</param>
    private static double GetQuietZoneTop(ISO15415QualityTest qualityTest)
    {
        int quietZoneSize = (int)qualityTest.QuietZoneSize;
        float[,] modulationMatrix = qualityTest.ModulationMatrix;
        int matrixHeight = modulationMatrix.GetLength(0);
        int matrixWidth = modulationMatrix.GetLength(1);
        int badModulationCount = 0;
        for (int y = 0; y < quietZoneSize; y++)
        {
            for (int x = 0; x < matrixWidth; x++)
            {
                if (Math.Abs(modulationMatrix[y, x]) < 0.175)
                    badModulationCount++;
            }
        }
        return GetPercent(badModulationCount, quietZoneSize * matrixWidth);
    }

    /// <summary>
    /// Returns the right quiet zone in percents.
    /// </summary>
    /// <param name="qualityTest">The quality test.</param>
    private static double GetQuietZoneRight(ISO15415QualityTest qualityTest)
    {
        int quietZoneSize = (int)qualityTest.QuietZoneSize;
        float[,] modulationMatrix = qualityTest.ModulationMatrix;
        int matrixHeight = modulationMatrix.GetLength(0);
        int matrixWidth = modulationMatrix.GetLength(1);
        int badModulationCount = 0;
        for (int y = 0; y < matrixHeight; y++)
        {
            for (int x = matrixWidth - quietZoneSize; x < matrixWidth; x++)
            {
                if (Math.Abs(modulationMatrix[y, x]) < 0.175)
                    badModulationCount++;
            }
        }
        return GetPercent(badModulationCount, quietZoneSize * matrixHeight);
    }

    /// <summary>
    /// Returns the left quiet zone in percents.
    /// </summary>
    /// <param name="qualityTest">The quality test.</param>
    private static double GetQuietZoneLeft(ISO15415QualityTest qualityTest)
    {
        int quietZoneSize = (int)qualityTest.QuietZoneSize;
        float[,] modulationMatrix = qualityTest.ModulationMatrix;
        int matrixHeight = modulationMatrix.GetLength(0);
        int matrixWidth = modulationMatrix.GetLength(1);
        int badModulationCount = 0;
        for (int y = 0; y < matrixHeight; y++)
        {
            for (int x = 0; x < quietZoneSize; x++)
            {
                if (Math.Abs(modulationMatrix[y, x]) < 0.175)
                    badModulationCount++;
            }
        }
        return GetPercent(badModulationCount, quietZoneSize * matrixHeight);
    }

    private static double GetPercent(int count, int total)
    {
        return 100 * (1 - (count / (double)total));
    }
}

Imports Vintasoft.Barcode
Imports Vintasoft.Barcode.QualityTests

Public Class ISO15415QualityTestQuietZoneModulationMatrix
    ''' <summary>
    ''' Prints the information about left, right, top and bottom quiet zone of 2D barcode.
    ''' </summary>
    ''' <param name="filename">The filename.</param>
    ''' <param name="barcodeType">Type of the barcode.</param>
    Public Shared Sub PrintLRTBQuietZoneInfo2D(filename As String, barcodeType As BarcodeType)
        Using qualityTestManager As New QualityTestManager(barcodeType)
            ' recognize barcodes and execute testing for recognized barcodes
            qualityTestManager.ExecuteTesting(filename)
            ' for each recognized barcode
            For Each qualityTest As ISO15415QualityTest In qualityTestManager.ISO15415Results
                ' print the quality test information
                Console.WriteLine("Barcode Type:        {0}", qualityTest.BarcodeInfo.BarcodeType)
                Console.WriteLine("Required Quiet Zone: {0}X", qualityTest.QuietZoneSize)
                Console.WriteLine("Barcode value:       {0}", qualityTest.BarcodeInfo.Value)
                Console.WriteLine("Quiet Zone Left:     {0}%", Math.Round(GetQuietZoneLeft(qualityTest), 1))
                Console.WriteLine("Quiet Zone Right:    {0}%", Math.Round(GetQuietZoneRight(qualityTest), 1))
                Console.WriteLine("Quiet Zone Top:      {0}%", Math.Round(GetQuietZoneTop(qualityTest), 1))
                Console.WriteLine("Quiet Zone Bottom:   {0}%", Math.Round(GetQuietZoneBottom(qualityTest), 1))
            Next
        End Using
    End Sub

    ''' <summary>
    ''' Returns the bottom quiet zone in percents.
    ''' </summary>
    ''' <param name="qualityTest">The quality test.</param>
    Private Shared Function GetQuietZoneBottom(qualityTest As ISO15415QualityTest) As Double
        Dim quietZoneSize As Integer = CInt(Math.Truncate(qualityTest.QuietZoneSize))
        Dim modulationMatrix As Single(,) = qualityTest.ModulationMatrix
        Dim matrixHeight As Integer = modulationMatrix.GetLength(0)
        Dim matrixWidth As Integer = modulationMatrix.GetLength(1)
        Dim badModulationCount As Integer = 0
        For y As Integer = matrixHeight - quietZoneSize To matrixHeight - 1
            For x As Integer = 0 To matrixWidth - 1
                If Math.Abs(modulationMatrix(y, x)) < 0.175 Then
                    badModulationCount += 1
                End If
            Next
        Next
        Return GetPercent(badModulationCount, quietZoneSize * matrixWidth)
    End Function

    ''' <summary>
    ''' Returns the top quiet zone in percents.
    ''' </summary>
    ''' <param name="qualityTest">The quality test.</param>
    Private Shared Function GetQuietZoneTop(qualityTest As ISO15415QualityTest) As Double
        Dim quietZoneSize As Integer = CInt(Math.Truncate(qualityTest.QuietZoneSize))
        Dim modulationMatrix As Single(,) = qualityTest.ModulationMatrix
        Dim matrixHeight As Integer = modulationMatrix.GetLength(0)
        Dim matrixWidth As Integer = modulationMatrix.GetLength(1)
        Dim badModulationCount As Integer = 0
        For y As Integer = 0 To quietZoneSize - 1
            For x As Integer = 0 To matrixWidth - 1
                If Math.Abs(modulationMatrix(y, x)) < 0.175 Then
                    badModulationCount += 1
                End If
            Next
        Next
        Return GetPercent(badModulationCount, quietZoneSize * matrixWidth)
    End Function

    ''' <summary>
    ''' Returns the right quiet zone in percents.
    ''' </summary>
    ''' <param name="qualityTest">The quality test.</param>
    Private Shared Function GetQuietZoneRight(qualityTest As ISO15415QualityTest) As Double
        Dim quietZoneSize As Integer = CInt(Math.Truncate(qualityTest.QuietZoneSize))
        Dim modulationMatrix As Single(,) = qualityTest.ModulationMatrix
        Dim matrixHeight As Integer = modulationMatrix.GetLength(0)
        Dim matrixWidth As Integer = modulationMatrix.GetLength(1)
        Dim badModulationCount As Integer = 0
        For y As Integer = 0 To matrixHeight - 1
            For x As Integer = matrixWidth - quietZoneSize To matrixWidth - 1
                If Math.Abs(modulationMatrix(y, x)) < 0.175 Then
                    badModulationCount += 1
                End If
            Next
        Next
        Return GetPercent(badModulationCount, quietZoneSize * matrixHeight)
    End Function

    ''' <summary>
    ''' Returns the left quiet zone in percents.
    ''' </summary>
    ''' <param name="qualityTest">The quality test.</param>
    Private Shared Function GetQuietZoneLeft(qualityTest As ISO15415QualityTest) As Double
        Dim quietZoneSize As Integer = CInt(Math.Truncate(qualityTest.QuietZoneSize))
        Dim modulationMatrix As Single(,) = qualityTest.ModulationMatrix
        Dim matrixHeight As Integer = modulationMatrix.GetLength(0)
        Dim matrixWidth As Integer = modulationMatrix.GetLength(1)
        Dim badModulationCount As Integer = 0
        For y As Integer = 0 To matrixHeight - 1
            For x As Integer = 0 To quietZoneSize - 1
                If Math.Abs(modulationMatrix(y, x)) < 0.175 Then
                    badModulationCount += 1
                End If
            Next
        Next
        Return GetPercent(badModulationCount, quietZoneSize * matrixHeight)
    End Function

    Private Shared Function GetPercent(count As Integer, total As Integer) As Double
        Return 100 * (1 - (count / CDbl(total)))
    End Function
End Class