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); }
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); } } } }