moduleSize() private static method

private static moduleSize ( int leftTopBlack, BitMatrix image, float &msize ) : bool
leftTopBlack int
image ZXing.Common.BitMatrix
msize float
return bool
コード例 #1
0
        /// <summary>
        /// This method detects a code in a "pure" image -- that is, pure monochrome image
        /// which contains only an unrotated, unskewed, image of a code, with some white border
        /// around it. This is a specialized method that works exceptionally fast in this special
        /// case.
        ///
        /// <seealso cref="ZXing.Datamatrix.DataMatrixReader.extractPureBits(BitMatrix)" />
        /// </summary>
        private static BitMatrix extractPureBits(BitMatrix image)
        {
            int[] leftTopBlack     = image.getTopLeftOnBit();
            int[] rightBottomBlack = image.getBottomRightOnBit();
            if (leftTopBlack == null || rightBottomBlack == null)
            {
                return(null);
            }

            float moduleSize;

            if (!QRCodeReader.moduleSize(leftTopBlack, image, out moduleSize))
            {
                return(null);
            }

            int top    = leftTopBlack[1];
            int bottom = rightBottomBlack[1];
            int left   = leftTopBlack[0];
            int right  = rightBottomBlack[0];

            // Sanity check!
            if (left >= right || top >= bottom)
            {
                return(null);
            }

            if (bottom - top != right - left)
            {
                // Special case, where bottom-right module wasn't black so we found something else in the last row
                // Assume it's a square, so use height as the width
                right = left + (bottom - top);
            }

            int matrixWidth  = (int)Math.Round((right - left + 1) / moduleSize);
            int matrixHeight = (int)Math.Round((bottom - top + 1) / moduleSize);

            if (matrixWidth <= 0 || matrixHeight <= 0)
            {
                return(null);
            }
            if (matrixHeight != matrixWidth)
            {
                // Only possibly decode square regions
                return(null);
            }

            // Push in the "border" by half the module width so that we start
            // sampling in the middle of the module. Just in case the image is a
            // little off, this will help recover.
            int nudge = (int)(moduleSize / 2.0f);

            top  += nudge;
            left += nudge;

            // But careful that this does not sample off the edge
            // "right" is the farthest-right valid pixel location -- right+1 is not necessarily
            // This is positive by how much the inner x loop below would be too large
            int nudgedTooFarRight = left + (int)((matrixWidth - 1) * moduleSize) - right;

            if (nudgedTooFarRight > 0)
            {
                if (nudgedTooFarRight > nudge)
                {
                    // Neither way fits; abort
                    return(null);
                }
                left -= nudgedTooFarRight;
            }
            // See logic above
            int nudgedTooFarDown = top + (int)((matrixHeight - 1) * moduleSize) - bottom;

            if (nudgedTooFarDown > 0)
            {
                if (nudgedTooFarDown > nudge)
                {
                    // Neither way fits; abort
                    return(null);
                }
                top -= nudgedTooFarDown;
            }

            // Now just read off the bits
            BitMatrix bits = new BitMatrix(matrixWidth, matrixHeight);

            for (int y = 0; y < matrixHeight; y++)
            {
                int iOffset = top + (int)(y * moduleSize);
                for (int x = 0; x < matrixWidth; x++)
                {
                    if (image[left + (int)(x * moduleSize), iOffset])
                    {
                        bits[x, y] = true;
                    }
                }
            }
            return(bits);
        }
コード例 #2
0
        /// <summary>
        /// This method detects a code in a "pure" image -- that is, pure monochrome image
        /// which contains only an unrotated, unskewed, image of a code, with some white border
        /// around it. This is a specialized method that works exceptionally fast in this special
        /// case.
        ///
        /// <seealso cref="ZXing.PDF417.PDF417Reader.extractPureBits(BitMatrix)" />
        /// <seealso cref="ZXing.Datamatrix.DataMatrixReader.extractPureBits(BitMatrix)" />
        /// </summary>
        private static BitMatrix extractPureBits(BitMatrix image)
        {
            int[] leftTopBlack     = image.getTopLeftOnBit();
            int[] rightBottomBlack = image.getBottomRightOnBit();
            if (leftTopBlack == null || rightBottomBlack == null)
            {
                return(null);
            }

            float moduleSize;

            if (!QRCodeReader.moduleSize(leftTopBlack, image, out moduleSize))
            {
                return(null);
            }

            int top    = leftTopBlack[1];
            int bottom = rightBottomBlack[1];
            int left   = leftTopBlack[0];
            int right  = rightBottomBlack[0];

            if (bottom - top != right - left)
            {
                // Special case, where bottom-right module wasn't black so we found something else in the last row
                // Assume it's a square, so use height as the width
                right = left + (bottom - top);
            }

            int matrixWidth  = (int)Math.Round((right - left + 1) / moduleSize);
            int matrixHeight = (int)Math.Round((bottom - top + 1) / moduleSize);

            if (matrixWidth <= 0 || matrixHeight <= 0)
            {
                return(null);
            }
            if (matrixHeight != matrixWidth)
            {
                // Only possibly decode square regions
                return(null);
            }

            // Push in the "border" by half the module width so that we start
            // sampling in the middle of the module. Just in case the image is a
            // little off, this will help recover.
            int nudge = (int)(moduleSize / 2.0f);

            top  += nudge;
            left += nudge;

            // Now just read off the bits
            BitMatrix bits = new BitMatrix(matrixWidth, matrixHeight);

            for (int y = 0; y < matrixHeight; y++)
            {
                int iOffset = top + (int)(y * moduleSize);
                for (int x = 0; x < matrixWidth; x++)
                {
                    if (image[left + (int)(x * moduleSize), iOffset])
                    {
                        bits[x, y] = true;
                    }
                }
            }
            return(bits);
        }