private static void GetbackgroundColor(ConnectedPixel connectElement, ref byte[] rgbValues, int nWidth, int nOffset)
        {
            List <PixelPoint> pixelPoints = new List <PixelPoint>()
            {
                new PixelPoint((short)(connectElement.m_leftXCor - 1), connectElement.m_topYCor),
                new PixelPoint((short)(connectElement.m_leftXCor + 1), connectElement.m_topYCor),
                new PixelPoint((short)(connectElement.m_rightXCor - 1), connectElement.m_bottomYCor),
                new PixelPoint((short)(connectElement.m_rightXCor + 1), connectElement.m_bottomYCor)
            };
            List <PixelPoint> pixelPoints1 = pixelPoints;
            short             r            = (short)(connectElement.m_color.R + connectElement.m_color.G + connectElement.m_color.B);

            List <PixelPoint> .Enumerator enumerator = pixelPoints1.GetEnumerator();
            int num = 0;

            while (enumerator.MoveNext())
            {
                PixelPoint current = enumerator.Current;
                int        yCor    = current.YCor * nWidth + current.XCor * 3 + current.YCor * nOffset;
                if ((yCor < 0 ? false : yCor <= (int)rgbValues.Length - 3))
                {
                    short num1 = (short)(rgbValues[yCor + 2] + rgbValues[yCor + 1] + rgbValues[yCor]);
                    short num2 = (short)Math.Abs((int)(r - num1));
                    if (num2 > 0)
                    {
                        if ((num <= 0 ? true : num < num2))
                        {
                            connectElement.m_bgColor.R = rgbValues[yCor + 2];
                            connectElement.m_bgColor.G = rgbValues[yCor + 1];
                            connectElement.m_bgColor.B = rgbValues[yCor];
                            num = num1;
                        }
                    }
                }
            }
        }
        public List <CharacterInfo> MatchJoinedCharacter(List <ConnectedPixel> connectingPixels)
        {
            List <CharacterInfo> characterInfos = new List <CharacterInfo>();
            CharacterPixel       characterPixel = new CharacterPixel();

            foreach (ConnectedPixel connectedPixel in connectingPixels.FindAll((ConnectedPixel x) => (x.m_width <= 6 || x.m_height <= 3 || x.m_width > 25 ? false : x.m_height <= 25)))
            {
                short mLeftXCor = connectedPixel.m_leftXCor;
                short num       = connectedPixel.m_leftXCor;
                short num1      = 4;
                while (mLeftXCor <= connectedPixel.m_rightXCor)
                {
                    mLeftXCor = (short)(num + num1);
                    if (mLeftXCor <= connectedPixel.m_rightXCor + 1)
                    {
                        List <PixelPoint> pixelPoints = new List <PixelPoint>();
                        short             num2        = 0;
                        short             num3        = 0;
                        for (int i = 0; i < connectedPixel.m_height; i++)
                        {
                            bool  mPixelCoordinate = true;
                            short num4             = 0;
                            for (int j = num; j < mLeftXCor; j++)
                            {
                                mPixelCoordinate = mPixelCoordinate & !connectedPixel.m_pixelCoordinate[j - connectedPixel.m_leftXCor, i];
                                if (connectedPixel.m_pixelCoordinate[j - connectedPixel.m_leftXCor, i])
                                {
                                    pixelPoints.Add(new PixelPoint(num4, num2));
                                }
                                num4 = (short)(num4 + 1);
                            }
                            if (mPixelCoordinate)
                            {
                                num3 = (short)(num3 + 1);
                            }
                            else
                            {
                                num2 = (short)(num2 + 1);
                            }
                        }
                        pixelPoints.Sort((PixelPoint object1, PixelPoint object2) => object1.XCor.CompareTo(object2.XCor));
                        PixelPoint item = pixelPoints[pixelPoints.Count - 1];
                        short      xCor = item.XCor;
                        item = pixelPoints[0];
                        short xCor1 = (short)(xCor - item.XCor + 1);
                        pixelPoints.Sort((PixelPoint object1, PixelPoint object2) => object1.YCor.CompareTo(object2.YCor));
                        item = pixelPoints[pixelPoints.Count - 1];
                        short yCor = item.YCor;
                        item = pixelPoints[0];
                        short yCor1 = (short)(yCor - item.YCor + 1);
                        bool[,] flagArray = new bool[xCor1, yCor1];
                        foreach (PixelPoint pixelPoint in pixelPoints)
                        {
                            flagArray[pixelPoint.XCor, pixelPoint.YCor] = true;
                        }
                        ConnectedPixel connectedPixel1 = new ConnectedPixel()
                        {
                            m_width           = xCor1,
                            m_height          = yCor1,
                            m_pixelCoordinate = flagArray,
                            m_color           = connectedPixel.m_color
                        };
                        ConnectedPixel connectedPixel2 = connectedPixel1;
                        int            num5            = characterPixel.m_characterInfo.FindIndex((CharacterInfo x) => this.MatchPixel(connectedPixel2, x));
                        if (num5 == -1)
                        {
                            num1 = (short)(num1 + 1);
                        }
                        else
                        {
                            CharacterInfo characterInfo = new CharacterInfo()
                            {
                                m_color            = connectedPixel2.m_color,
                                m_bgColor          = connectedPixel.m_bgColor,
                                Character          = characterPixel.m_characterInfo[num5].Character,
                                TopYCor            = (short)(connectedPixel.m_topYCor + num3),
                                LeftXCor           = num,
                                BottomYCor         = (short)(connectedPixel.m_topYCor + num3 + characterPixel.m_characterInfo[num5].Height - 1),
                                RightXCor          = (short)(mLeftXCor - 1),
                                CharacterDirection = characterPixel.m_characterInfo[num5].CharacterDirection,
                                Width  = characterPixel.m_characterInfo[num5].Width,
                                Height = characterPixel.m_characterInfo[num5].Height
                            };
                            characterInfos.Add(characterInfo);
                            num  = mLeftXCor;
                            num1 = 4;
                        }
                        if (num1 > 5)
                        {
                            break;
                        }
                    }
                    else
                    {
                        break;
                    }
                }
            }
            return(characterInfos);
        }
Example #3
0
        internal Dictionary <short, List <PixelPoint> > GetImageLabel(Bitmap bitmap)
        {
            byte[] numArray;
            int    num;
            int    num1;
            short  i;
            short  j;
            short  num2;

            ImageLabeling.GetRgbArrayFromImage(bitmap, out numArray, out num, out num1);
            List <PixelPoint> pixelPoints = new List <PixelPoint>()
            {
                new PixelPoint(-1, -1),
                new PixelPoint(0, -1),
                new PixelPoint(1, -1),
                new PixelPoint(-1, 0),
                new PixelPoint(1, 0),
                new PixelPoint(-1, 1),
                new PixelPoint(0, 1),
                new PixelPoint(1, 1)
            };
            List <PixelPoint> pixelPoints1 = pixelPoints;
            short             width        = (short)(bitmap.Width * 3);

            short[,] numArray1 = new short[bitmap.Width, bitmap.Height];
            short num3 = 1;
            Dictionary <short, List <short> > nums = new Dictionary <short, List <short> >();

            for (i = 1; i < bitmap.Height - 1; i = (short)(i + 1))
            {
                for (j = 3; j < bitmap.Width - 3; j = (short)(j + 1))
                {
                    List <short> nums1     = new List <short>();
                    int          num4      = i * width + j * 3 + i * num1;
                    byte[]       numArray2 = new byte[] { numArray[num4 + 2], numArray[num4 + 1], numArray[num4] };
                    byte[]       numArray3 = numArray2;
                    PxColor      pxColor   = new PxColor()
                    {
                        R = numArray3[0],
                        G = numArray3[1],
                        B = numArray3[2]
                    };
                    num2 = 32767;
                    List <PixelPoint> .Enumerator enumerator = pixelPoints1.GetEnumerator();
                    while (enumerator.MoveNext())
                    {
                        PixelPoint current = enumerator.Current;
                        short      yCor    = (short)(current.YCor + i);
                        short      xCor    = (short)(current.XCor + j);
                        int        num5    = yCor * width + xCor * 3 + yCor * num1;
                        numArray2 = new byte[] { numArray[num5 + 2], numArray[num5 + 1], numArray[num5] };
                        byte[] numArray4 = numArray2;
                        if ((numArray3[0] != numArray4[0] || numArray3[1] != numArray4[1] ? false : numArray3[2] == numArray4[2]))
                        {
                            if ((numArray1[xCor, yCor] == 0 ? false : !nums1.Contains(numArray1[xCor, yCor])))
                            {
                                num2 = Math.Min(num2, numArray1[xCor, yCor]);
                                nums1.Add(numArray1[xCor, yCor]);
                            }
                        }
                    }
                    if (num2 == 32767)
                    {
                        short num6 = num3;
                        num3 = (short)(num6 + 1);
                        num2 = num6;
                    }
                    numArray1[j, i] = num2;
                    if (!nums.ContainsKey(num2))
                    {
                        nums.Add(num2, new List <short>());
                    }
                    foreach (short num7 in nums1)
                    {
                        if (!nums[num2].Contains(num7))
                        {
                            nums[num2].Add(num7);
                        }
                        if (!nums.ContainsKey(num7))
                        {
                            nums.Add(num7, new List <short>());
                        }
                        if (!nums[num7].Contains(num2))
                        {
                            nums[num7].Add(num2);
                        }
                    }
                }
            }
            Dictionary <short, short> nums2 = ImageLabeling.RecordEquailance(nums, num3);

            nums.Clear();
            Dictionary <short, List <PixelPoint> > nums3 = new Dictionary <short, List <PixelPoint> >();

            for (i = 0; i < bitmap.Height; i = (short)(i + 1))
            {
                for (j = 0; j < bitmap.Width; j = (short)(j + 1))
                {
                    num2 = (nums2.ContainsKey(numArray1[j, i]) ? nums2[numArray1[j, i]] : numArray1[j, i]);
                    if (!nums3.ContainsKey(num2))
                    {
                        nums3.Add(num2, new List <PixelPoint>());
                    }
                    nums3[num2].Add(new PixelPoint(j, i));
                }
            }
            return(nums3);
        }
        internal List <ConnectedPixel> GetConnectedMarkPixel(ConnectedPixel markConnected, short minCount)
        {
            List <ConnectedPixel> connectedPixels = new List <ConnectedPixel>();
            List <int>            nums            = new List <int>();
            int mHeight = (markConnected.m_height - 1) * markConnected.m_width + (markConnected.m_width - 1);

            bool[] flagArray = new bool[mHeight + 1];
            for (short i = 0; i < markConnected.m_width; i = (short)(i + 1))
            {
                for (short j = 0; j < markConnected.m_height; j = (short)(j + 1))
                {
                    if (markConnected.m_pixelCoordinate[i, j])
                    {
                        int mWidth = j * markConnected.m_width + i;
                        nums.Add(mWidth);
                        flagArray[mWidth] = true;
                    }
                }
            }
            List <int> nums1 = new List <int>();
            int        num   = 0;

            while (num != nums.Count)
            {
                if (!nums1.Contains(nums[num]))
                {
                    List <int> nums2 = new List <int>()
                    {
                        nums[num]
                    };
                    List <PixelPoint> pixelPoints = new List <PixelPoint>();
                    for (int k = 0; k != nums2.Count; k++)
                    {
                        int item    = nums2[k];
                        int mWidth1 = item - markConnected.m_width - 1;
                        int num1    = item - markConnected.m_width;
                        int mWidth2 = item - markConnected.m_width + 1;
                        int num2    = item - 1;
                        int num3    = item + 1;
                        int mWidth3 = item + markConnected.m_width - 1;
                        int mWidth4 = item + markConnected.m_width;
                        int num4    = item + markConnected.m_width + 1;
                        ConnectedCoordinate.MatchNeighbConnected(markConnected, mWidth1, mHeight, nums2);
                        ConnectedCoordinate.MatchNeighbConnected(markConnected, num1, mHeight, nums2);
                        ConnectedCoordinate.MatchNeighbConnected(markConnected, mWidth2, mHeight, nums2);
                        ConnectedCoordinate.MatchNeighbConnected(markConnected, num2, mHeight, nums2);
                        ConnectedCoordinate.MatchNeighbConnected(markConnected, num3, mHeight, nums2);
                        ConnectedCoordinate.MatchNeighbConnected(markConnected, mWidth3, mHeight, nums2);
                        ConnectedCoordinate.MatchNeighbConnected(markConnected, mWidth4, mHeight, nums2);
                        ConnectedCoordinate.MatchNeighbConnected(markConnected, num4, mHeight, nums2);
                        nums1.Add(nums2[k]);
                        short num5  = (short)Math.Floor((double)nums2[k] / (double)markConnected.m_width);
                        short item1 = (short)(nums2[k] - num5 * markConnected.m_width);
                        pixelPoints.Add(new PixelPoint(item1, num5));
                    }
                    if (nums2.Count > minCount)
                    {
                        pixelPoints.Sort((PixelPoint sObject1, PixelPoint sObject2) => sObject1.YCor.CompareTo(sObject2.YCor));
                        int yCor  = pixelPoints.FirstOrDefault <PixelPoint>().YCor;
                        int yCor1 = pixelPoints.LastOrDefault <PixelPoint>().YCor;
                        pixelPoints.Sort((PixelPoint sObject1, PixelPoint sObject2) => sObject1.XCor.CompareTo(sObject2.XCor));
                        int            xCor           = pixelPoints.FirstOrDefault <PixelPoint>().XCor;
                        int            xCor1          = pixelPoints.LastOrDefault <PixelPoint>().XCor;
                        short          num6           = (short)(xCor1 - xCor + 1);
                        short          num7           = (short)(yCor1 - yCor + 1);
                        ConnectedPixel connectedPixel = new ConnectedPixel()
                        {
                            m_pixelCoordinate = new bool[num6, num7],
                            m_color           = markConnected.m_color,
                            m_bgColor         = markConnected.m_bgColor,
                            m_width           = num6,
                            m_height          = num7,
                            m_topYCor         = (short)(markConnected.m_topYCor + yCor)
                        };
                        ConnectedPixel mTopYCor = connectedPixel;
                        mTopYCor.m_bottomYCor = (short)(mTopYCor.m_topYCor + num7 - 1);
                        mTopYCor.m_leftXCor   = (short)(markConnected.m_leftXCor + xCor);
                        mTopYCor.m_rightXCor  = (short)(mTopYCor.m_leftXCor + num6 - 1);
                        List <PixelPoint> .Enumerator enumerator = pixelPoints.GetEnumerator();
                        while (enumerator.MoveNext())
                        {
                            PixelPoint current = enumerator.Current;
                            mTopYCor.m_pixelCoordinate[current.XCor - xCor, current.YCor - yCor] = true;
                        }
                        connectedPixels.Add(mTopYCor);
                    }
                    num++;
                }
                else
                {
                    num++;
                }
            }
            return(connectedPixels);
        }
        internal List <ConnectedPixel> GetConnectedPixel(Bitmap bitmap, Dictionary <short, List <PixelPoint> > dicPixelPointConncected)
        {
            byte[] numArray;
            int    num;
            int    num1;

            ImageLabeling.GetRgbArrayFromImage(bitmap, out numArray, out num, out num1);
            List <ConnectedPixel> connectedPixels = new List <ConnectedPixel>();
            short          width          = (short)(bitmap.Width * 3);
            CharacterPixel characterPixel = new CharacterPixel();
            CharacterInfo  characterInfo  = characterPixel.m_characterInfo.Find((CharacterInfo x) => (x.CharacterDirection != Direction.Horizontal || x.Character != 'i' ? false : x.m_fontWeight == FontWeight.Bold));
            CharacterInfo  characterInfo1 = characterPixel.m_characterInfo.Find((CharacterInfo x) => (x.CharacterDirection != Direction.Horizontal || x.Character != 'i' ? false : x.m_fontWeight == FontWeight.Normal));

            characterPixel.m_characterInfo.RemoveAll((CharacterInfo x) => (x == characterInfo ? false : x != characterInfo1));
            foreach (KeyValuePair <short, List <PixelPoint> > keyValuePair in dicPixelPointConncected)
            {
                if (keyValuePair.Value.Count <= 4000)
                {
                    keyValuePair.Value.Sort((PixelPoint sObject1, PixelPoint sObject2) => sObject1.YCor.CompareTo(sObject2.YCor));
                    PixelPoint pixelPoint = keyValuePair.Value.FirstOrDefault <PixelPoint>();
                    int        yCor       = pixelPoint.YCor;
                    pixelPoint = keyValuePair.Value.LastOrDefault <PixelPoint>();
                    int yCor1 = pixelPoint.YCor;
                    keyValuePair.Value.Sort((PixelPoint sObject1, PixelPoint sObject2) => sObject1.XCor.CompareTo(sObject2.XCor));
                    pixelPoint = keyValuePair.Value.FirstOrDefault <PixelPoint>();
                    int xCor = pixelPoint.XCor;
                    pixelPoint = keyValuePair.Value.LastOrDefault <PixelPoint>();
                    int xCor1 = pixelPoint.XCor;
                    pixelPoint = keyValuePair.Value.First <PixelPoint>();
                    int yCor2 = pixelPoint.YCor * width; // was short why?
                    pixelPoint = keyValuePair.Value.First <PixelPoint>();
                    int xCor2 = yCor2 + pixelPoint.XCor * 3;
                    pixelPoint = keyValuePair.Value.First <PixelPoint>();
                    int            num2           = xCor2 + pixelPoint.YCor * num1;
                    short          num3           = (short)(xCor1 - xCor + 1);
                    short          num4           = (short)(yCor1 - yCor + 1);
                    ConnectedPixel connectedPixel = new ConnectedPixel()
                    {
                        m_pixelCoordinate = new bool[num3, num4]
                    };
                    PxColor pxColor = new PxColor()
                    {
                        R = numArray[num2 + 2],
                        G = numArray[num2 + 1],
                        B = numArray[num2]
                    };
                    connectedPixel.m_color      = pxColor;
                    connectedPixel.m_height     = num4;
                    connectedPixel.m_width      = num3;
                    connectedPixel.m_topYCor    = (short)yCor;
                    connectedPixel.m_bottomYCor = (short)yCor1;
                    connectedPixel.m_leftXCor   = (short)xCor;
                    connectedPixel.m_rightXCor  = (short)xCor1;
                    ConnectedPixel connectedPixel1 = connectedPixel;
                    ConnectedCoordinate.CheckSpecialSeperatedDotCharacter(connectedPixel1, connectedPixels, characterInfo, characterInfo1, keyValuePair);
                    ConnectedCoordinate.GetbackgroundColor(connectedPixel1, ref numArray, width, num1);
                    connectedPixels.Add(connectedPixel1);
                }
            }
            return(connectedPixels);
        }
        private void GenerateChracterPixel()
        {
            Regex regex = new Regex("(?<xCor>(\\d)+)[,](?<yCor>(\\d)+)");

            string[] strArrays = new string[] { "TypeOne", "TypeTwo" };
            for (int i = 0; i < (int)strArrays.Length; i++)
            {
                string str        = strArrays[i];
                string str1       = str;
                var    collection =
                    from subitem in this.XmlDoc.Descendants(str).Elements <XElement>("CharacterInfo")
                    let xElement = subitem.Element("ParamValue")
                                   where xElement != null
                                   let element = subitem.Element("PixelInfo")
                                                 where element != null
                                                 select new { Character = char.Parse(xElement.Value), PixelInfo = element.Value, CharacterDirection = Direction.Horizontal, FontWeight = (str1 == "TypeTwo" ? FontWeight.Bold : FontWeight.Normal), Pixel = regex.Matches(element.Value) };
                foreach (var variable in collection)
                {
                    List <PixelPoint> list = (
                        from Match oMatch in variable.Pixel
                        let xCor = short.Parse(oMatch.Groups["xCor"].Value)
                                   let yCor = short.Parse(oMatch.Groups["yCor"].Value)
                                              select new PixelPoint(xCor, yCor)).ToList <PixelPoint>();
                    CharacterInfo characterInfo = new CharacterInfo();
                    if (list.Count > 0)
                    {
                        list.Sort((PixelPoint object1, PixelPoint object2) => object1.XCor.CompareTo(object2.XCor));
                        PixelPoint item = list[list.Count - 1];
                        short      num  = item.XCor;
                        item = list[0];
                        byte num1 = (byte)(num - item.XCor + 1);
                        list.Sort((PixelPoint object1, PixelPoint object2) => object1.YCor.CompareTo(object2.YCor));
                        item = list[list.Count - 1];
                        short num2 = item.YCor;
                        item = list[0];
                        byte num3 = (byte)(num2 - item.YCor + 1);
                        bool[,] flagArray = new bool[num1, num3];
                        foreach (PixelPoint pixelPoint in list)
                        {
                            flagArray[pixelPoint.XCor, pixelPoint.YCor] = true;
                        }
                        characterInfo.Character          = variable.Character;
                        characterInfo.m_fontWeight       = variable.FontWeight;
                        characterInfo.CharacterDirection = variable.CharacterDirection;
                        characterInfo.m_pixelCoordinate  = flagArray;
                        characterInfo.Width  = num1;
                        characterInfo.Height = num3;
                        this.m_characterInfo.Add(characterInfo);
                        CharacterInfo characterInfo1 = new CharacterInfo()
                        {
                            Character          = variable.Character,
                            m_fontWeight       = variable.FontWeight,
                            CharacterDirection = Direction.Vertical,
                            m_pixelCoordinate  = CharacterPixel.ChangeOrderVerticalLeftToRight(flagArray),
                            Width  = num3,
                            Height = num1
                        };
                        characterInfo = characterInfo1;
                        this.m_characterInfo.Add(characterInfo);
                    }
                }
            }
        }