/// <summary>
        /// Creates the barcode matrix.
        /// </summary>
        /// <returns>The barcode matrix.</returns>
        /// <param name="detectionResult">Detection result.</param>
        private static BarcodeValue[][] createBarcodeMatrix(DetectionResult detectionResult)
        {
            // Manually setup Jagged Array in C#
            var barcodeMatrix = new BarcodeValue[detectionResult.RowCount][];

            for (int row = 0; row < barcodeMatrix.Length; row++)
            {
                barcodeMatrix[row] = new BarcodeValue[detectionResult.ColumnCount + 2];
                for (int col = 0; col < barcodeMatrix[row].Length; col++)
                {
                    barcodeMatrix[row][col] = new BarcodeValue();
                }
            }

            int column = 0;

            foreach (DetectionResultColumn detectionResultColumn in detectionResult.getDetectionResultColumns())
            {
                if (detectionResultColumn != null)
                {
                    foreach (Codeword codeword in detectionResultColumn.Codewords)
                    {
                        if (codeword != null)
                        {
                            int rowNumber = codeword.RowNumber;
                            if (rowNumber >= 0)
                            {
                                if (rowNumber >= barcodeMatrix.Length)
                                {
                                    // We have more rows than the barcode metadata allows for, ignore them.
                                    continue;
                                }
                                barcodeMatrix[rowNumber][column].setValue(codeword.Value);
                            }
                        }
                    }
                }
                column++;
            }

            return(barcodeMatrix);
        }
        /// <summary>
        /// Returns a <see cref="System.String"/> that represents the <see cref="ZXing.PDF417.Internal.BarcodeValue"/> jagged array.
        /// </summary>
        /// <returns>A <see cref="System.String"/> that represents the <see cref="ZXing.PDF417.Internal.BarcodeValue"/> jagged array.</returns>
        /// <param name="barcodeMatrix">Barcode matrix as a jagged array.</param>
        public static String ToString(BarcodeValue[][] barcodeMatrix)
        {
            StringBuilder formatter = new StringBuilder();

            for (int row = 0; row < barcodeMatrix.Length; row++)
            {
                formatter.AppendFormat(CultureInfo.InvariantCulture, "Row {0,2}: ", row);
                for (int column = 0; column < barcodeMatrix[row].Length; column++)
                {
                    BarcodeValue barcodeValue = barcodeMatrix[row][column];
                    int[]        values       = barcodeValue.getValue();
                    if (values.Length == 0)
                    {
                        formatter.Append("        ");
                    }
                    else
                    {
                        formatter.AppendFormat(CultureInfo.InvariantCulture, "{0,4}({1,2})", values[0], barcodeValue.getConfidence(values[0]));
                    }
                }
                formatter.Append("\n");
            }
            return(formatter.ToString());
        }
Пример #3
0
        /// <summary>
        /// Gets the barcode metadata.
        /// </summary>
        /// <returns>The barcode metadata.</returns>
        public BarcodeMetadata getBarcodeMetadata()
        {
            var          codewords                = Codewords;
            BarcodeValue barcodeColumnCount       = new BarcodeValue();
            BarcodeValue barcodeRowCountUpperPart = new BarcodeValue();
            BarcodeValue barcodeRowCountLowerPart = new BarcodeValue();
            BarcodeValue barcodeECLevel           = new BarcodeValue();

            foreach (Codeword codeword in codewords)
            {
                if (codeword == null)
                {
                    continue;
                }
                codeword.setRowNumberAsRowIndicatorColumn();
                int rowIndicatorValue = codeword.Value % 30;
                int codewordRowNumber = codeword.RowNumber;
                if (!IsLeft)
                {
                    codewordRowNumber += 2;
                }
                switch (codewordRowNumber % 3)
                {
                case 0:
                    barcodeRowCountUpperPart.setValue(rowIndicatorValue * 3 + 1);
                    break;

                case 1:
                    barcodeECLevel.setValue(rowIndicatorValue / 3);
                    barcodeRowCountLowerPart.setValue(rowIndicatorValue % 3);
                    break;

                case 2:
                    barcodeColumnCount.setValue(rowIndicatorValue + 1);
                    break;
                }
            }
            // Maybe we should check if we have ambiguous values?
            var barcodeColumnCountValues       = barcodeColumnCount.getValue();
            var barcodeRowCountUpperPartValues = barcodeRowCountUpperPart.getValue();
            var barcodeRowCountLowerPartValues = barcodeRowCountLowerPart.getValue();
            var barcodeECLevelValues           = barcodeECLevel.getValue();

            if ((barcodeColumnCountValues.Length == 0) ||
                (barcodeRowCountUpperPartValues.Length == 0) ||
                (barcodeRowCountLowerPartValues.Length == 0) ||
                (barcodeECLevelValues.Length == 0) ||
                barcodeColumnCountValues[0] < 1 ||
                barcodeRowCountUpperPartValues[0] + barcodeRowCountLowerPartValues[0] < PDF417Common.MIN_ROWS_IN_BARCODE ||
                barcodeRowCountUpperPartValues[0] + barcodeRowCountLowerPartValues[0] > PDF417Common.MAX_ROWS_IN_BARCODE)
            {
                return(null);
            }
            var barcodeMetadata = new BarcodeMetadata(barcodeColumnCountValues[0],
                                                      barcodeRowCountUpperPartValues[0],
                                                      barcodeRowCountLowerPartValues[0],
                                                      barcodeECLevelValues[0]);

            removeIncorrectCodewords(codewords, barcodeMetadata);
            return(barcodeMetadata);
        }