diff --git a/ImageRecognition/CharacterInfo.cs b/ImageRecognition/CharacterInfo.cs new file mode 100644 index 0000000..1f80f8e --- /dev/null +++ b/ImageRecognition/CharacterInfo.cs @@ -0,0 +1,33 @@ +namespace ImageRecognition +{ + public sealed class CharacterInfo + { + internal PxColor m_color; + + internal PxColor m_bgColor; + + internal bool[,] m_pixelCoordinate; + + internal FontWeight m_fontWeight; + + public short BottomYCor{get;set;} + + public char Character{get;set;} + + public Direction CharacterDirection{get;set;} + + public byte Height{get;set;} + + public short LeftXCor{get;set;} + + public short RightXCor{get;set;} + + public short TopYCor{get;set;} + + public byte Width{get;set;} + + public CharacterInfo() + { + } + } +} \ No newline at end of file diff --git a/ImageRecognition/CharacterPixel.cs b/ImageRecognition/CharacterPixel.cs new file mode 100644 index 0000000..2cc09d8 --- /dev/null +++ b/ImageRecognition/CharacterPixel.cs @@ -0,0 +1,137 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using System.Xml.Linq; + +namespace ImageRecognition +{ + class CharacterPixel + { + private const string dataSource = "PixelFormat.xml"; + + private readonly XDocument XmlDoc; + + private readonly string FullDbPath = string.Empty; + + internal List m_characterInfo = new List(); + + internal CharacterPixel() + { + this.FullDbPath = Path.GetFullPath("PixelFormat.xml"); + this.XmlDoc = XDocument.Load(this.FullDbPath); + this.GenerateChracterPixel(); + } + + private static bool[,] ChangeOrderVerticalLeftToRight(bool[,] pixInfo) + { + bool[,] flagArray; + if (pixInfo != null) + { + byte length = (byte)pixInfo.GetLength(0); + byte num = (byte)pixInfo.GetLength(1); + bool[,] flagArray1 = new bool[num, length]; + for (short i = 0; i < length; i = (short)(i + 1)) + { + for (short j = 0; j < num; j = (short)(j + 1)) + { + short num1 = (short)(length - i - 1); + flagArray1[j, i] = pixInfo[num1, j]; + } + } + flagArray = flagArray1; + } + else + { + flagArray = null; + } + return flagArray; + } + + internal List DistinctWidthHeight() + { + List dimensions = new List(); + foreach (CharacterInfo mCharacterInfo in this.m_characterInfo) + { + Dimension dimension = new Dimension() + { + m_height = mCharacterInfo.Height, + m_width = mCharacterInfo.Width + }; + if (!dimensions.Contains(dimension)) + { + Dimension dimension1 = new Dimension() + { + m_height = mCharacterInfo.Height, + m_width = mCharacterInfo.Width + }; + dimensions.Add(dimension1); + } + } + return dimensions; + } + + private void GenerateChracterPixel() + { + Regex regex = new Regex("(?(\\d)+)[,](?(\\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("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 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(); + 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); + } + } + } + } + } +} \ No newline at end of file diff --git a/ImageRecognition/ConnectedCoordinate.cs b/ImageRecognition/ConnectedCoordinate.cs new file mode 100644 index 0000000..5d37f3f --- /dev/null +++ b/ImageRecognition/ConnectedCoordinate.cs @@ -0,0 +1,250 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; + +namespace ImageRecognition +{ + class ConnectedCoordinate + { + public ConnectedCoordinate() + { + } + + private static void CheckSpecialSeperatedDotCharacter(ConnectedPixel connectElement, List lstConnectedElement, CharacterInfo ibold, CharacterInfo iUnbold, KeyValuePair> currentConnectedpixel) + { + bool flag; + if (connectElement.m_width != 2 || connectElement.m_height != 6) + { + flag = (connectElement.m_width != 1 ? true : connectElement.m_height != 6); + } + else + { + flag = false; + } + if (flag) + { + List.Enumerator enumerator = currentConnectedpixel.Value.GetEnumerator(); + while (enumerator.MoveNext()) + { + PixelPoint current = enumerator.Current; + connectElement.m_pixelCoordinate[current.XCor - connectElement.m_leftXCor, current.YCor - connectElement.m_topYCor] = true; + } + } + else + { + int num = (connectElement.m_width == 2 ? 2 : 3); + int num1 = lstConnectedElement.FindIndex((ConnectedPixel x) => (x.m_bottomYCor != connectElement.m_topYCor - num || x.m_leftXCor != connectElement.m_leftXCor || x.m_color.R != connectElement.m_color.R || x.m_color.G != connectElement.m_color.G ? false : x.m_color.B == connectElement.m_color.B)); + if (num1 > -1) + { + connectElement.m_height = (short)(connectElement.m_height + num); + connectElement.m_topYCor = lstConnectedElement[num1].m_topYCor; + connectElement.m_pixelCoordinate = (connectElement.m_width == 2 ? ibold.m_pixelCoordinate : iUnbold.m_pixelCoordinate); + lstConnectedElement.RemoveAt(num1); + } + } + } + + private static void GetbackgroundColor(ConnectedPixel connectElement, ref byte[] rgbValues, int nWidth, int nOffset) + { + List pixelPoints = new List() + { + 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 pixelPoints1 = pixelPoints; + short r = (short)(connectElement.m_color.R + connectElement.m_color.G + connectElement.m_color.B); + List.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; + } + } + } + } + } + + internal List GetConnectedMarkPixel(ConnectedPixel markConnected, short minCount) + { + List connectedPixels = new List(); + List nums = new List(); + 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 nums1 = new List(); + int num = 0; + while (num != nums.Count) + { + if (!nums1.Contains(nums[num])) + { + List nums2 = new List() + { + nums[num] + }; + List pixelPoints = new List(); + 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().YCor; + int yCor1 = pixelPoints.LastOrDefault().YCor; + pixelPoints.Sort((PixelPoint sObject1, PixelPoint sObject2) => sObject1.XCor.CompareTo(sObject2.XCor)); + int xCor = pixelPoints.FirstOrDefault().XCor; + int xCor1 = pixelPoints.LastOrDefault().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.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 GetConnectedPixel(Bitmap bitmap, Dictionary> dicPixelPointConncected) + { + byte[] numArray; + int num; + int num1; + ImageLabeling.GetRgbArrayFromImage(bitmap, out numArray, out num, out num1); + List connectedPixels = new List(); + 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> 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(); + int yCor = pixelPoint.YCor; + pixelPoint = keyValuePair.Value.LastOrDefault(); + int yCor1 = pixelPoint.YCor; + keyValuePair.Value.Sort((PixelPoint sObject1, PixelPoint sObject2) => sObject1.XCor.CompareTo(sObject2.XCor)); + pixelPoint = keyValuePair.Value.FirstOrDefault(); + int xCor = pixelPoint.XCor; + pixelPoint = keyValuePair.Value.LastOrDefault(); + int xCor1 = pixelPoint.XCor; + pixelPoint = keyValuePair.Value.First(); + int yCor2 = pixelPoint.YCor * width; // was short why? + pixelPoint = keyValuePair.Value.First(); + int xCor2 = yCor2 + pixelPoint.XCor * 3; + pixelPoint = keyValuePair.Value.First(); + 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 static void MatchNeighbConnected(ConnectedPixel markConnected, int neighindex, int maxIndex, ICollection procossedId) + { + if ((neighindex < 0 ? false : neighindex <= maxIndex)) + { + short num = (short)Math.Floor((double)neighindex / (double)markConnected.m_width); + short num1 = (short)(neighindex - num * markConnected.m_width); + if ((!markConnected.m_pixelCoordinate[num1, num] ? false : !procossedId.Contains(neighindex))) + { + procossedId.Add(neighindex); + } + } + } + } +} \ No newline at end of file diff --git a/ImageRecognition/ConnectedPixel.cs b/ImageRecognition/ConnectedPixel.cs new file mode 100644 index 0000000..9c639b5 --- /dev/null +++ b/ImageRecognition/ConnectedPixel.cs @@ -0,0 +1,25 @@ +namespace ImageRecognition +{ + internal class ConnectedPixel + { + internal bool[,] m_pixelCoordinate; + + internal PxColor m_color; + + internal PxColor m_bgColor; + + internal short m_width; + + internal short m_height; + + internal short m_leftXCor; + + internal short m_rightXCor; + + internal short m_topYCor; + + internal short m_bottomYCor; + + public ConnectedPixel() { } + } +} \ No newline at end of file diff --git a/ImageRecognition/Dimension.cs b/ImageRecognition/Dimension.cs new file mode 100644 index 0000000..9e3a2ca --- /dev/null +++ b/ImageRecognition/Dimension.cs @@ -0,0 +1,9 @@ +namespace ImageRecognition +{ + internal class Dimension + { + internal byte m_width; + + internal byte m_height; + } +} \ No newline at end of file diff --git a/ImageRecognition/Direction.cs b/ImageRecognition/Direction.cs new file mode 100644 index 0000000..aa84beb --- /dev/null +++ b/ImageRecognition/Direction.cs @@ -0,0 +1,8 @@ +namespace ImageRecognition +{ + public enum Direction + { + Horizontal, + Vertical + } +} \ No newline at end of file diff --git a/ImageRecognition/FontWeight.cs b/ImageRecognition/FontWeight.cs new file mode 100644 index 0000000..664d0b5 --- /dev/null +++ b/ImageRecognition/FontWeight.cs @@ -0,0 +1,8 @@ +namespace ImageRecognition +{ + public enum FontWeight + { + Bold, + Normal + } +} \ No newline at end of file diff --git a/ImageRecognition/ImageAnalyzer.cs b/ImageRecognition/ImageAnalyzer.cs new file mode 100644 index 0000000..67aaee2 --- /dev/null +++ b/ImageRecognition/ImageAnalyzer.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Drawing; + +namespace ImageRecognition +{ + public class ImageAnalyzer + { + public ImageAnalyzer() + { + } + + public List HorizontalWord(Bitmap bitmap) + { + ConnectedCoordinate connectedCoordinate = new ConnectedCoordinate(); + ImageLabeling imageLabeling = new ImageLabeling(); + MatchCharacter matchCharacter = new MatchCharacter(); + Word word = new Word(); + DateTime now = DateTime.Now; + Dictionary> imageLabel = imageLabeling.GetImageLabel(bitmap); + TimeSpan timeSpan = DateTime.Now - now; + //Console.WriteLine("execution time image labeling {0} ms", timeSpan.TotalMilliseconds); + List connectedPixel = connectedCoordinate.GetConnectedPixel(bitmap, imageLabel); + List characterInfos = matchCharacter.GetMatchCharacter(connectedPixel); + characterInfos.AddRange(matchCharacter.MatchJoinedCharacter(connectedPixel)); + return word.GetHorizontalWord(characterInfos); + } + } +} \ No newline at end of file diff --git a/ImageRecognition/ImageLabeling.cs b/ImageRecognition/ImageLabeling.cs new file mode 100644 index 0000000..fd2ace2 --- /dev/null +++ b/ImageRecognition/ImageLabeling.cs @@ -0,0 +1,182 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.Linq; +using System.Runtime.InteropServices; + +namespace ImageRecognition +{ + internal class ImageLabeling + { + public ImageLabeling() + { + } + + internal Dictionary> 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 pixelPoints = new List() + { + 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 pixelPoints1 = pixelPoints; + short width = (short)(bitmap.Width * 3); + short[,] numArray1 = new short[bitmap.Width, bitmap.Height]; + short num3 = 1; + Dictionary> nums = new Dictionary>(); + for (i = 1; i < bitmap.Height - 1; i = (short)(i + 1)) + { + for (j = 3; j < bitmap.Width - 3; j = (short)(j + 1)) + { + List nums1 = new List(); + 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.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()); + } + foreach (short num7 in nums1) + { + if (!nums[num2].Contains(num7)) + { + nums[num2].Add(num7); + } + if (!nums.ContainsKey(num7)) + { + nums.Add(num7, new List()); + } + if (!nums[num7].Contains(num2)) + { + nums[num7].Add(num2); + } + } + } + } + Dictionary nums2 = ImageLabeling.RecordEquailance(nums, num3); + nums.Clear(); + Dictionary> nums3 = new Dictionary>(); + 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()); + } + nums3[num2].Add(new PixelPoint(j, i)); + } + } + return nums3; + } + + internal static void GetRgbArrayFromImage(Bitmap bitmap, out byte[] rgbValues, out int bytes, out int nOffset) + { + BitmapData bitmapDatum = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); + IntPtr scan0 = bitmapDatum.Scan0; + bytes = Math.Abs(bitmapDatum.Stride) * bitmap.Height; + rgbValues = new byte[bytes]; + nOffset = bitmapDatum.Stride - bitmapDatum.Width * 3; + Marshal.Copy(scan0, rgbValues, 0, bytes); + bitmap.UnlockBits(bitmapDatum); + } + + private static Dictionary RecordEquailance(IDictionary> dicUnqualLabelId, short maxLabelId) + { + Dictionary nums = new Dictionary(); + short num = 1; + while (num <= maxLabelId) + { + if (!dicUnqualLabelId.ContainsKey(num)) + { + num = (short)(num + 1); + } + else if ((dicUnqualLabelId[num].Count == 0 ? false : !nums.ContainsKey(num))) + { + List nums1 = new List() + { + num + }; + short num1 = 0; + while (num1 != nums1.Count) + { + List item = dicUnqualLabelId[nums1[num1]]; + if (item.Count != 0) + { + foreach (short num2 in + from addId in item + where !nums1.Contains(addId) + select addId) + { + nums1.Add(num2); + } + num1 = (short)(num1 + 1); + } + else + { + num1 = (short)(num1 + 1); + } + } + nums1.Sort(); + foreach (short num3 in nums1) + { + nums[num3] = nums1[0]; + } + num = (short)(num + 1); + } + else + { + num = (short)(num + 1); + } + } + return nums; + } + } +} \ No newline at end of file diff --git a/ImageRecognition/ImageRecognition.cs b/ImageRecognition/ImageRecognition.cs new file mode 100644 index 0000000..f73f8a2 --- /dev/null +++ b/ImageRecognition/ImageRecognition.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ImageRecognition +{ + public class ImageRecognition + { + + } +} \ No newline at end of file diff --git a/ImageRecognition/ImageRecognition.csproj b/ImageRecognition/ImageRecognition.csproj new file mode 100644 index 0000000..c687255 --- /dev/null +++ b/ImageRecognition/ImageRecognition.csproj @@ -0,0 +1,69 @@ + + + + + Debug + AnyCPU + {2DDC7187-07B6-4AA7-B193-5073A24FB50E} + Library + Properties + ImageRecognition + ImageRecognition + v4.5.1 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ImageRecognition/MatchCharacter.cs b/ImageRecognition/MatchCharacter.cs new file mode 100644 index 0000000..8bc36ee --- /dev/null +++ b/ImageRecognition/MatchCharacter.cs @@ -0,0 +1,221 @@ +using System.Collections.Generic; + +namespace ImageRecognition +{ + internal class MatchCharacter + { + public MatchCharacter() + { + } + + public List GetMatchCharacter(List connectingPixels) + { + CharacterPixel characterPixel = new CharacterPixel(); + List characterInfos = new List(); + List connectedPixels = connectingPixels.FindAll((ConnectedPixel x) => (x.m_width > 18 ? false : x.m_height <= 18)); + foreach (CharacterInfo mCharacterInfo in characterPixel.m_characterInfo) + { + foreach (ConnectedPixel connectedPixel in connectedPixels.FindAll((ConnectedPixel x) => (x.m_width != mCharacterInfo.Width || x.m_height != mCharacterInfo.Height ? false : this.MatchPixel(x, mCharacterInfo)))) + { + CharacterInfo characterInfo = new CharacterInfo() + { + m_color = connectedPixel.m_color, + m_bgColor = connectedPixel.m_bgColor, + m_fontWeight = mCharacterInfo.m_fontWeight, + TopYCor = connectedPixel.m_topYCor, + BottomYCor = connectedPixel.m_bottomYCor, + LeftXCor = connectedPixel.m_leftXCor, + RightXCor = connectedPixel.m_rightXCor, + Width = (byte)connectedPixel.m_width, + Height = (byte)connectedPixel.m_height, + CharacterDirection = mCharacterInfo.CharacterDirection, + Character = mCharacterInfo.Character + }; + characterInfos.Add(characterInfo); + connectingPixels.Remove(connectedPixel); + } + } + return characterInfos; + } + + public List MatchJoinedCharacter(List connectingPixels) + { + List characterInfos = new List(); + 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 pixelPoints = new List(); + 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 bool MatchOverlayCharacter(ConnectedPixel connectingPixels, CharacterInfo characterInfo, List diffMarkerXIndex) + { + bool flag; + if ((characterInfo.Width == 0 || connectingPixels.m_width == 0 || characterInfo.Height != connectingPixels.m_height ? false : characterInfo.Width == connectingPixels.m_width)) + { + short num = 0; + for (int i = 0; i < characterInfo.Width; i++) + { + short num1 = 0; + int num2 = 0; + while (num2 < characterInfo.Height) + { + if ((connectingPixels.m_pixelCoordinate[i, num2] ? true : !characterInfo.m_pixelCoordinate[num, num1])) + { + if (diffMarkerXIndex.FindIndex((short s) => s == i) != -1) + { + num1 = (short)(num1 + 1); + } + else if (connectingPixels.m_pixelCoordinate[i, num2] == characterInfo.m_pixelCoordinate[num, num1]) + { + num1 = (short)(num1 + 1); + } + else + { + flag = false; + return flag; + } + num2++; + } + else + { + flag = false; + return flag; + } + } + num = (short)(num + 1); + } + flag = true; + } + else + { + flag = false; + } + return flag; + } + + internal bool MatchPixel(ConnectedPixel connectedElement, CharacterInfo alphabetInfo) + { + bool flag; + if (!(connectedElement.m_pixelCoordinate == null ? false : alphabetInfo.m_pixelCoordinate != null)) + { + flag = false; + } + else if ((alphabetInfo.Width != connectedElement.m_width ? false : alphabetInfo.Height == connectedElement.m_height)) + { + for (short i = 0; i < alphabetInfo.Width; i = (short)(i + 1)) + { + short num = 0; + while (num < alphabetInfo.Height) + { + if (alphabetInfo.m_pixelCoordinate[i, num] == connectedElement.m_pixelCoordinate[i, num]) + { + num = (short)(num + 1); + } + else + { + flag = false; + return flag; + } + } + } + flag = true; + } + else + { + flag = false; + } + return flag; + } + } +} \ No newline at end of file diff --git a/ImageRecognition/PixelPoint.cs b/ImageRecognition/PixelPoint.cs new file mode 100644 index 0000000..c1e5d6e --- /dev/null +++ b/ImageRecognition/PixelPoint.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +namespace ImageRecognition +{ + internal struct PixelPoint + { + private readonly short XCordinate; + + private readonly short YCordinate; + + internal short XCor + { + get + { + return this.XCordinate; + } + } + + internal short YCor + { + get + { + return this.YCordinate; + } + } + + internal PixelPoint(short tempxCor, short tempyCor) + { + this.XCordinate = tempxCor; + this.YCordinate = tempyCor; + } + } +} \ No newline at end of file diff --git a/ImageRecognition/Properties/AssemblyInfo.cs b/ImageRecognition/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..98f3aed --- /dev/null +++ b/ImageRecognition/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Les informations générales relatives à un assembly dépendent de +// l'ensemble d'attributs suivant. Changez les valeurs de ces attributs pour modifier les informations +// associées à un assembly. +[assembly: AssemblyTitle("ImageRecognition")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Hewlett-Packard Company")] +[assembly: AssemblyProduct("ImageRecognition")] +[assembly: AssemblyCopyright("Copyright © Hewlett-Packard Company 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// L'affectation de la valeur false à ComVisible rend les types invisibles dans cet assembly +// aux composants COM. Si vous devez accéder à un type dans cet assembly à partir de +// COM, affectez la valeur true à l'attribut ComVisible sur ce type. +[assembly: ComVisible(false)] + +// Le GUID suivant est pour l'ID de la typelib si ce projet est exposé à COM +[assembly: Guid("2ddc7187-07b6-4aa7-b193-5073a24fb50e")] + +// Les informations de version pour un assembly se composent des quatre valeurs suivantes : +// +// Version principale +// Version secondaire +// Numéro de build +// Révision +// +// Vous pouvez spécifier toutes les valeurs ou indiquer les numéros de build et de révision par défaut +// en utilisant '*', comme indiqué ci-dessous : +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ImageRecognition/PxColor.cs b/ImageRecognition/PxColor.cs new file mode 100644 index 0000000..fef8325 --- /dev/null +++ b/ImageRecognition/PxColor.cs @@ -0,0 +1,23 @@ +namespace ImageRecognition +{ + public struct PxColor + { + public byte B + { + get; + set; + } + + public byte G + { + get; + set; + } + + public byte R + { + get; + set; + } + } +} \ No newline at end of file diff --git a/ImageRecognition/Word.cs b/ImageRecognition/Word.cs new file mode 100644 index 0000000..1f3b74d --- /dev/null +++ b/ImageRecognition/Word.cs @@ -0,0 +1,165 @@ +using System; +using System.Collections.Generic; + +namespace ImageRecognition +{ + internal sealed class Word + { + public Word() + { + } + + internal List GetHorizontalWord(List recoginizedCharacter) + { + List characterInfos = recoginizedCharacter.FindAll((CharacterInfo x) => x.CharacterDirection == Direction.Horizontal); + characterInfos.Sort((CharacterInfo sObject1, CharacterInfo sObject2) => sObject1.LeftXCor.CompareTo(sObject2.LeftXCor)); + List wordInfos = new List(); + while (characterInfos.Count > 0) + { + List characterInfos1 = characterInfos.FindAll((CharacterInfo x) => (x.m_color.R != characterInfos[0].m_color.R || x.m_color.G != characterInfos[0].m_color.G || x.m_color.B != characterInfos[0].m_color.B || Math.Abs((int)(characterInfos[0].m_bgColor.R + characterInfos[0].m_bgColor.G + characterInfos[0].m_bgColor.B - (x.m_bgColor.R + x.m_bgColor.G + x.m_bgColor.B))) >= 100 || x.LeftXCor < characterInfos[0].LeftXCor || x.LeftXCor - characterInfos[0].RightXCor >= 230 ? false : (x.TopYCor < characterInfos[0].TopYCor || x.TopYCor > characterInfos[0].BottomYCor ? (characterInfos[0].TopYCor < x.TopYCor ? false : characterInfos[0].TopYCor <= x.BottomYCor) : true))); + List characterInfos2 = new List(); + string str = characterInfos1[0].Character.ToString(); + characterInfos2.Add(characterInfos1[0]); + characterInfos.Remove(characterInfos1[0]); + bool flag = (str.Contains(".") || str.Contains("-") || str.Contains("_") ? true : str.Contains("|")); + for (short i = 1; i < characterInfos1.Count; i = (short)(i + 1)) + { + short leftXCor = (short)(characterInfos1[i].LeftXCor - characterInfos2[characterInfos2.Count - 1].RightXCor); + if ((leftXCor < 0 ? false : leftXCor <= 4)) + { + str = string.Format("{0}{1}{2}", str, (leftXCor > 5 ? " " : string.Empty), characterInfos1[i].Character); + characterInfos.Remove(characterInfos1[i]); + characterInfos2.Add(characterInfos1[i]); + flag = flag & (str.Contains(".") || str.Contains("-") || str.Contains("_") ? true : str.Contains("|")); + } + } + if ((str.Length <= 0 ? false : !flag)) + { + WordInfo wordInfo = new WordInfo() + { + CharacterInfo = new List() + }; + short num = characterInfos2[0].LeftXCor; + short rightXCor = characterInfos2[0].RightXCor; + short topYCor = characterInfos2[0].TopYCor; + short bottomYCor = characterInfos2[0].BottomYCor; + foreach (CharacterInfo characterInfo in characterInfos2) + { + CharacterInfo characterInfo1 = characterInfo; + int num1 = recoginizedCharacter.FindIndex((CharacterInfo x) => (x.LeftXCor != characterInfo1.LeftXCor || x.TopYCor != characterInfo1.TopYCor ? false : x.CharacterDirection == Direction.Vertical)); + if (num1 > -1) + { + recoginizedCharacter.RemoveAt(num1); + } + num = Math.Min(characterInfo.LeftXCor, num); + rightXCor = Math.Max(characterInfo.RightXCor, rightXCor); + topYCor = Math.Min(characterInfo.TopYCor, topYCor); + bottomYCor = Math.Max(characterInfo.BottomYCor, bottomYCor); + wordInfo.BottomYCor = characterInfos2[0].TopYCor; + wordInfo.Direction = Direction.Horizontal; + wordInfo.CharacterInfo.Add(characterInfo); + } + wordInfo.Word = str; + wordInfo.FontWeight = characterInfos2[0].m_fontWeight; + wordInfo.Color = characterInfos2[0].m_color; + wordInfo.LeftXCor = num; + wordInfo.RightXCor = rightXCor; + wordInfo.TopYCor = topYCor; + wordInfo.BottomYCor = bottomYCor; + wordInfos.Add(wordInfo); + } + } + return wordInfos; + } + + internal List GetVerticalWord(List recoginizedCharacter) + { + List characterInfos = recoginizedCharacter.FindAll((CharacterInfo x) => x.CharacterDirection == Direction.Vertical); + characterInfos.Sort((CharacterInfo sObject1, CharacterInfo sObject2) => sObject1.BottomYCor.CompareTo(sObject2.BottomYCor)); + List wordInfos = new List(); + while (characterInfos.Count > 0) + { + CharacterInfo item = characterInfos[characterInfos.Count - 1]; + List characterInfos1 = characterInfos.FindAll((CharacterInfo x) => (x.m_color.R != item.m_color.R || x.m_color.G != item.m_color.G || x.m_color.B != item.m_color.B || x.BottomYCor > item.BottomYCor || item.TopYCor - x.BottomYCor <= 0 || item.TopYCor - x.BottomYCor >= 200 ? false : (x.LeftXCor < item.LeftXCor || x.LeftXCor > item.RightXCor ? (item.LeftXCor < x.LeftXCor ? false : item.LeftXCor <= x.RightXCor) : true))); + if (characterInfos1.Count != 0) + { + List characterInfos2 = new List(); + string str = item.Character.ToString(); + characterInfos2.Add(item); + characterInfos.Remove(item); + bool flag = (str.Contains(".") ? true : str.Contains("-")); + for (short i = (short)(characterInfos1.Count - 1); i > -1; i = (short)(i - 1)) + { + short topYCor = (short)(characterInfos2[characterInfos2.Count - 1].TopYCor - characterInfos1[i].BottomYCor); + if ((topYCor < 0 ? false : topYCor <= 12)) + { + str = string.Format("{0}{1}{2}", str, (topYCor > 5 ? " " : string.Empty), characterInfos1[i].Character); + characterInfos.Remove(characterInfos1[i]); + characterInfos2.Add(characterInfos1[i]); + flag = flag & (str.Contains(".") ? true : str.Contains("-")); + } + } + if ((str.Length <= 0 ? false : !flag)) + { + WordInfo wordInfo = new WordInfo() + { + CharacterInfo = new List() + }; + short leftXCor = characterInfos2[0].LeftXCor; + short rightXCor = characterInfos2[0].RightXCor; + short num = characterInfos2[0].TopYCor; + short bottomYCor = characterInfos2[0].BottomYCor; + foreach (CharacterInfo characterInfo in characterInfos2) + { + leftXCor = Math.Min(characterInfo.LeftXCor, leftXCor); + rightXCor = Math.Max(characterInfo.RightXCor, rightXCor); + num = Math.Min(characterInfo.TopYCor, num); + bottomYCor = Math.Max(characterInfo.BottomYCor, bottomYCor); + wordInfo.BottomYCor = characterInfos2[0].TopYCor; + wordInfo.Direction = Direction.Vertical; + wordInfo.CharacterInfo.Add(characterInfo); + } + wordInfo.Word = str; + wordInfo.Color = characterInfos2[0].m_color; + wordInfo.FontWeight = characterInfos2[0].m_fontWeight; + wordInfo.LeftXCor = leftXCor; + wordInfo.RightXCor = rightXCor; + wordInfo.TopYCor = num; + wordInfo.BottomYCor = bottomYCor; + wordInfos.Add(wordInfo); + } + } + else + { + characterInfos.Remove(item); + } + } + return wordInfos; + } + + internal List GetVerticalWord(List recoginizedWordInfo) + { + List wordInfos = recoginizedWordInfo.FindAll((WordInfo x) => x.Direction == Direction.Vertical); + wordInfos.Sort((WordInfo sObject1, WordInfo sObject2) => sObject1.LeftXCor.CompareTo(sObject2.LeftXCor)); + List wordInfos1 = new List(); + while (wordInfos.Count > 0) + { + WordInfo item = wordInfos[0]; + List wordInfos2 = wordInfos.FindAll((WordInfo x) => (x.Color.R != item.Color.R || x.Color.G != item.Color.G || x.Color.B != item.Color.B || x.LeftXCor - item.RightXCor <= 0 || x.LeftXCor - item.RightXCor >= 5 ? false : (x.TopYCor < item.TopYCor || x.TopYCor > item.BottomYCor ? (item.TopYCor < x.TopYCor ? false : item.TopYCor <= x.BottomYCor) : true))); + string word = item.Word; + WordInfo fontWeight = item; + fontWeight.FontWeight = item.FontWeight; + wordInfos.Remove(item); + for (short i = (short)(wordInfos2.Count - 1); i > -1; i = (short)(i - 1)) + { + word = string.Format("{0} {1}", word, wordInfos2[i].Word); + fontWeight.CharacterInfo.AddRange(wordInfos2[i].CharacterInfo); + wordInfos.Remove(wordInfos2[i]); + } + fontWeight.Word = word; + wordInfos1.Add(fontWeight); + } + return wordInfos1; + } + } +} \ No newline at end of file diff --git a/ImageRecognition/WordInfo.cs b/ImageRecognition/WordInfo.cs new file mode 100644 index 0000000..2912d23 --- /dev/null +++ b/ImageRecognition/WordInfo.cs @@ -0,0 +1,65 @@ +using System.Collections.Generic; + +namespace ImageRecognition +{ + public sealed class WordInfo + { + public short BottomYCor + { + get; + set; + } + + public List CharacterInfo + { + get; + set; + } + + public PxColor Color + { + get; + set; + } + + public Direction Direction + { + get; + set; + } + + public FontWeight FontWeight + { + get; + set; + } + + public short LeftXCor + { + get; + set; + } + + public short RightXCor + { + get; + set; + } + + public short TopYCor + { + get; + set; + } + + public string Word + { + get; + set; + } + + public WordInfo() + { + } + } +} \ No newline at end of file diff --git a/OpticalCharacterRecognition.sln b/OpticalCharacterRecognition.sln new file mode 100644 index 0000000..3c0fecb --- /dev/null +++ b/OpticalCharacterRecognition.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.23107.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpticalCharacterRecognition", "OpticalCharacterRecognition\OpticalCharacterRecognition.csproj", "{B492FE99-F506-48C7-8D6D-B35C2CDEF668}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImageRecognition", "ImageRecognition\ImageRecognition.csproj", "{2DDC7187-07B6-4AA7-B193-5073A24FB50E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B492FE99-F506-48C7-8D6D-B35C2CDEF668}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B492FE99-F506-48C7-8D6D-B35C2CDEF668}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B492FE99-F506-48C7-8D6D-B35C2CDEF668}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B492FE99-F506-48C7-8D6D-B35C2CDEF668}.Release|Any CPU.Build.0 = Release|Any CPU + {2DDC7187-07B6-4AA7-B193-5073A24FB50E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2DDC7187-07B6-4AA7-B193-5073A24FB50E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2DDC7187-07B6-4AA7-B193-5073A24FB50E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2DDC7187-07B6-4AA7-B193-5073A24FB50E}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/OpticalCharacterRecognition/AboutBoxApplication.Designer.cs b/OpticalCharacterRecognition/AboutBoxApplication.Designer.cs new file mode 100644 index 0000000..700011f --- /dev/null +++ b/OpticalCharacterRecognition/AboutBoxApplication.Designer.cs @@ -0,0 +1,196 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace OpticalCharacterRecognition +{ + partial class AboutBoxApplication + { + /// + /// Variable nécessaire au concepteur. + /// + private IContainer components = null; + + /// + /// Nettoyage des ressources utilisées. + /// + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Code généré par le Concepteur Windows Form + + /// + /// Méthode requise pour la prise en charge du concepteur - ne modifiez pas + /// le contenu de cette méthode avec l'éditeur de code. + /// + private void InitializeComponent() + { + ComponentResourceManager resources = new ComponentResourceManager(typeof(AboutBoxApplication)); + this.tableLayoutPanel = new TableLayoutPanel(); + this.logoPictureBox = new PictureBox(); + this.labelProductName = new Label(); + this.labelVersion = new Label(); + this.labelCopyright = new Label(); + this.labelCompanyName = new Label(); + this.textBoxDescription = new TextBox(); + this.okButton = new Button(); + this.tableLayoutPanel.SuspendLayout(); + ((ISupportInitialize)(this.logoPictureBox)).BeginInit(); + this.SuspendLayout(); + // + // tableLayoutPanel + // + this.tableLayoutPanel.ColumnCount = 2; + this.tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33F)); + this.tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 67F)); + this.tableLayoutPanel.Controls.Add(this.logoPictureBox, 0, 0); + this.tableLayoutPanel.Controls.Add(this.labelProductName, 1, 0); + this.tableLayoutPanel.Controls.Add(this.labelVersion, 1, 1); + this.tableLayoutPanel.Controls.Add(this.labelCopyright, 1, 2); + this.tableLayoutPanel.Controls.Add(this.labelCompanyName, 1, 3); + this.tableLayoutPanel.Controls.Add(this.textBoxDescription, 1, 4); + this.tableLayoutPanel.Controls.Add(this.okButton, 1, 5); + this.tableLayoutPanel.Dock = DockStyle.Fill; + this.tableLayoutPanel.Location = new Point(12, 11); + this.tableLayoutPanel.Margin = new Padding(4); + this.tableLayoutPanel.Name = "tableLayoutPanel"; + this.tableLayoutPanel.RowCount = 6; + this.tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 10F)); + this.tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 10F)); + this.tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 10F)); + this.tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 10F)); + this.tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 50F)); + this.tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 10F)); + this.tableLayoutPanel.Size = new Size(556, 326); + this.tableLayoutPanel.TabIndex = 0; + // + // logoPictureBox + // + this.logoPictureBox.Dock = DockStyle.Fill; + this.logoPictureBox.Image = ((Image)(resources.GetObject("logoPictureBox.Image"))); + this.logoPictureBox.Location = new Point(4, 4); + this.logoPictureBox.Margin = new Padding(4); + this.logoPictureBox.Name = "logoPictureBox"; + this.tableLayoutPanel.SetRowSpan(this.logoPictureBox, 6); + this.logoPictureBox.Size = new Size(175, 318); + this.logoPictureBox.SizeMode = PictureBoxSizeMode.StretchImage; + this.logoPictureBox.TabIndex = 12; + this.logoPictureBox.TabStop = false; + // + // labelProductName + // + this.labelProductName.Dock = DockStyle.Fill; + this.labelProductName.Location = new Point(191, 0); + this.labelProductName.Margin = new Padding(8, 0, 4, 0); + this.labelProductName.MaximumSize = new Size(0, 21); + this.labelProductName.Name = "labelProductName"; + this.labelProductName.Size = new Size(361, 21); + this.labelProductName.TabIndex = 19; + this.labelProductName.Text = "Nom du produit"; + this.labelProductName.TextAlign = ContentAlignment.MiddleLeft; + // + // labelVersion + // + this.labelVersion.Dock = DockStyle.Fill; + this.labelVersion.Location = new Point(191, 32); + this.labelVersion.Margin = new Padding(8, 0, 4, 0); + this.labelVersion.MaximumSize = new Size(0, 21); + this.labelVersion.Name = "labelVersion"; + this.labelVersion.Size = new Size(361, 21); + this.labelVersion.TabIndex = 0; + this.labelVersion.Text = "Version"; + this.labelVersion.TextAlign = ContentAlignment.MiddleLeft; + // + // labelCopyright + // + this.labelCopyright.Dock = DockStyle.Fill; + this.labelCopyright.Location = new Point(191, 64); + this.labelCopyright.Margin = new Padding(8, 0, 4, 0); + this.labelCopyright.MaximumSize = new Size(0, 21); + this.labelCopyright.Name = "labelCopyright"; + this.labelCopyright.Size = new Size(361, 21); + this.labelCopyright.TabIndex = 21; + this.labelCopyright.Text = "Copyright"; + this.labelCopyright.TextAlign = ContentAlignment.MiddleLeft; + // + // labelCompanyName + // + this.labelCompanyName.Dock = DockStyle.Fill; + this.labelCompanyName.Location = new Point(191, 96); + this.labelCompanyName.Margin = new Padding(8, 0, 4, 0); + this.labelCompanyName.MaximumSize = new Size(0, 21); + this.labelCompanyName.Name = "labelCompanyName"; + this.labelCompanyName.Size = new Size(361, 21); + this.labelCompanyName.TabIndex = 22; + this.labelCompanyName.Text = "Nom de la société"; + this.labelCompanyName.TextAlign = ContentAlignment.MiddleLeft; + // + // textBoxDescription + // + this.textBoxDescription.Dock = DockStyle.Fill; + this.textBoxDescription.Location = new Point(191, 132); + this.textBoxDescription.Margin = new Padding(8, 4, 4, 4); + this.textBoxDescription.Multiline = true; + this.textBoxDescription.Name = "textBoxDescription"; + this.textBoxDescription.ReadOnly = true; + this.textBoxDescription.ScrollBars = ScrollBars.Both; + this.textBoxDescription.Size = new Size(361, 155); + this.textBoxDescription.TabIndex = 23; + this.textBoxDescription.TabStop = false; + this.textBoxDescription.Text = "Description"; + // + // okButton + // + this.okButton.Anchor = ((AnchorStyles)((AnchorStyles.Bottom | AnchorStyles.Right))); + this.okButton.DialogResult = DialogResult.Cancel; + this.okButton.Location = new Point(452, 295); + this.okButton.Margin = new Padding(4); + this.okButton.Name = "okButton"; + this.okButton.Size = new Size(100, 27); + this.okButton.TabIndex = 24; + this.okButton.Text = "&OK"; + this.okButton.Click += new EventHandler(this.okButton_Click); + // + // AboutBoxApplication + // + this.AcceptButton = this.okButton; + this.AutoScaleDimensions = new SizeF(8F, 16F); + this.AutoScaleMode = AutoScaleMode.Font; + this.ClientSize = new Size(580, 348); + this.Controls.Add(this.tableLayoutPanel); + this.FormBorderStyle = FormBorderStyle.FixedDialog; + this.Margin = new Padding(4); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "AboutBoxApplication"; + this.Padding = new Padding(12, 11, 12, 11); + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = FormStartPosition.CenterParent; + this.Text = "AboutBoxApplication"; + this.tableLayoutPanel.ResumeLayout(false); + this.tableLayoutPanel.PerformLayout(); + ((ISupportInitialize)(this.logoPictureBox)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private TableLayoutPanel tableLayoutPanel; + private PictureBox logoPictureBox; + private Label labelProductName; + private Label labelVersion; + private Label labelCopyright; + private Label labelCompanyName; + private TextBox textBoxDescription; + private Button okButton; + } +} diff --git a/OpticalCharacterRecognition/AboutBoxApplication.cs b/OpticalCharacterRecognition/AboutBoxApplication.cs new file mode 100644 index 0000000..cb7485c --- /dev/null +++ b/OpticalCharacterRecognition/AboutBoxApplication.cs @@ -0,0 +1,126 @@ +/* +The MIT License(MIT) +Copyright(c) 2015 Freddy Juhel +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +using System; +using System.IO; +using System.Reflection; +using System.Windows.Forms; + +namespace OpticalCharacterRecognition +{ + partial class AboutBoxApplication : Form + { + public AboutBoxApplication() + { + InitializeComponent(); + Text = String.Format("À propos de {0}", AssemblyTitle); + labelProductName.Text = AssemblyProduct; + labelVersion.Text = String.Format("Version {0}", AssemblyVersion); + labelCopyright.Text = AssemblyCopyright; + labelCompanyName.Text = AssemblyCompany; + textBoxDescription.Text = AssemblyDescription; + } + + #region Accesseurs d'attribut de l'assembly + + public string AssemblyTitle + { + get + { + object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false); + if (attributes.Length > 0) + { + AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0]; + if (titleAttribute.Title != "") + { + return titleAttribute.Title; + } + } + return Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase); + } + } + + public string AssemblyVersion + { + get + { + return Assembly.GetExecutingAssembly().GetName().Version.ToString(); + } + } + + public string AssemblyDescription + { + get + { + object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false); + if (attributes.Length == 0) + { + return ""; + } + return ((AssemblyDescriptionAttribute)attributes[0]).Description; + } + } + + public string AssemblyProduct + { + get + { + object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false); + if (attributes.Length == 0) + { + return ""; + } + return ((AssemblyProductAttribute)attributes[0]).Product; + } + } + + public string AssemblyCopyright + { + get + { + object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false); + if (attributes.Length == 0) + { + return ""; + } + return ((AssemblyCopyrightAttribute)attributes[0]).Copyright; + } + } + + public string AssemblyCompany + { + get + { + object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false); + if (attributes.Length == 0) + { + return ""; + } + return ((AssemblyCompanyAttribute)attributes[0]).Company; + } + } + #endregion + + private void okButton_Click(object sender, EventArgs e) + { + Close(); + } + } +} \ No newline at end of file diff --git a/OpticalCharacterRecognition/AboutBoxApplication.resx b/OpticalCharacterRecognition/AboutBoxApplication.resx new file mode 100644 index 0000000..0d686c1 --- /dev/null +++ b/OpticalCharacterRecognition/AboutBoxApplication.resx @@ -0,0 +1,604 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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 + AAAAAElFTkSuQmCC + + + \ No newline at end of file diff --git a/OpticalCharacterRecognition/App.config b/OpticalCharacterRecognition/App.config new file mode 100644 index 0000000..d15dfc5 --- /dev/null +++ b/OpticalCharacterRecognition/App.config @@ -0,0 +1,36 @@ + + + + +
+ + + + + + + + + 600 + + + 800 + + + 0 + + + 0 + + + English + + + Translations.xml + + + Large + + + + diff --git a/OpticalCharacterRecognition/FormMain.Designer.cs b/OpticalCharacterRecognition/FormMain.Designer.cs new file mode 100644 index 0000000..3ad0650 --- /dev/null +++ b/OpticalCharacterRecognition/FormMain.Designer.cs @@ -0,0 +1,489 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace OpticalCharacterRecognition +{ + partial class FormMain + { + /// + /// Variable nécessaire au concepteur. + /// + private IContainer components = null; + + /// + /// Nettoyage des ressources utilisées. + /// + /// true si les ressources managées doivent être supprimées ; sinon, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Code généré par le Concepteur Windows Form + + /// + /// Méthode requise pour la prise en charge du concepteur - ne modifiez pas + /// le contenu de cette méthode avec l'éditeur de code. + /// + private void InitializeComponent() + { + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator = new System.Windows.Forms.ToolStripSeparator(); + this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveasToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.printToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.printPreviewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.quitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.cancelToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.redoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.cutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.pasteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + this.selectAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.personalizeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.optionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.languagetoolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.frenchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.englishToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.DisplayToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SmallToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.MediumToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.LargeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.summaryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.indexToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.searchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); + this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.button1 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + this.menuStrip1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.SuspendLayout(); + // + // menuStrip1 + // + this.menuStrip1.ImageScalingSize = new System.Drawing.Size(20, 20); + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fileToolStripMenuItem, + this.editToolStripMenuItem, + this.toolsToolStripMenuItem, + this.languagetoolStripMenuItem, + this.DisplayToolStripMenuItem, + this.helpToolStripMenuItem}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Padding = new System.Windows.Forms.Padding(5, 2, 0, 2); + this.menuStrip1.Size = new System.Drawing.Size(1260, 28); + this.menuStrip1.TabIndex = 1; + this.menuStrip1.Text = "menuStrip1"; + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripMenuItem, + this.openToolStripMenuItem, + this.toolStripSeparator, + this.saveToolStripMenuItem, + this.saveasToolStripMenuItem, + this.toolStripSeparator1, + this.printToolStripMenuItem, + this.printPreviewToolStripMenuItem, + this.toolStripSeparator2, + this.quitToolStripMenuItem}); + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Size = new System.Drawing.Size(64, 24); + this.fileToolStripMenuItem.Text = "&Fichier"; + // + // newToolStripMenuItem + // + this.newToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.newToolStripMenuItem.Name = "newToolStripMenuItem"; + this.newToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N))); + this.newToolStripMenuItem.Size = new System.Drawing.Size(247, 26); + this.newToolStripMenuItem.Text = "&Nouveau"; + // + // openToolStripMenuItem + // + this.openToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.openToolStripMenuItem.Name = "openToolStripMenuItem"; + this.openToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); + this.openToolStripMenuItem.Size = new System.Drawing.Size(247, 26); + this.openToolStripMenuItem.Text = "&Ouvrir"; + // + // toolStripSeparator + // + this.toolStripSeparator.Name = "toolStripSeparator"; + this.toolStripSeparator.Size = new System.Drawing.Size(244, 6); + // + // saveToolStripMenuItem + // + this.saveToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.saveToolStripMenuItem.Name = "saveToolStripMenuItem"; + this.saveToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); + this.saveToolStripMenuItem.Size = new System.Drawing.Size(247, 26); + this.saveToolStripMenuItem.Text = "&Enregistrer"; + // + // saveasToolStripMenuItem + // + this.saveasToolStripMenuItem.Name = "saveasToolStripMenuItem"; + this.saveasToolStripMenuItem.Size = new System.Drawing.Size(247, 26); + this.saveasToolStripMenuItem.Text = "Enregistrer &sous"; + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(244, 6); + // + // printToolStripMenuItem + // + this.printToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.printToolStripMenuItem.Name = "printToolStripMenuItem"; + this.printToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.P))); + this.printToolStripMenuItem.Size = new System.Drawing.Size(247, 26); + this.printToolStripMenuItem.Text = "&Imprimer"; + // + // printPreviewToolStripMenuItem + // + this.printPreviewToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.printPreviewToolStripMenuItem.Name = "printPreviewToolStripMenuItem"; + this.printPreviewToolStripMenuItem.Size = new System.Drawing.Size(247, 26); + this.printPreviewToolStripMenuItem.Text = "Aperçu a&vant impression"; + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(244, 6); + // + // quitToolStripMenuItem + // + this.quitToolStripMenuItem.Name = "quitToolStripMenuItem"; + this.quitToolStripMenuItem.Size = new System.Drawing.Size(247, 26); + this.quitToolStripMenuItem.Text = "&Quitter"; + this.quitToolStripMenuItem.Click += new System.EventHandler(this.QuitToolStripMenuItem_Click); + // + // editToolStripMenuItem + // + this.editToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.cancelToolStripMenuItem, + this.redoToolStripMenuItem, + this.toolStripSeparator3, + this.cutToolStripMenuItem, + this.copyToolStripMenuItem, + this.pasteToolStripMenuItem, + this.toolStripSeparator4, + this.selectAllToolStripMenuItem}); + this.editToolStripMenuItem.Name = "editToolStripMenuItem"; + this.editToolStripMenuItem.Size = new System.Drawing.Size(68, 24); + this.editToolStripMenuItem.Text = "&Edition"; + // + // cancelToolStripMenuItem + // + this.cancelToolStripMenuItem.Name = "cancelToolStripMenuItem"; + this.cancelToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Z))); + this.cancelToolStripMenuItem.Size = new System.Drawing.Size(197, 26); + this.cancelToolStripMenuItem.Text = "&Annuler"; + // + // redoToolStripMenuItem + // + this.redoToolStripMenuItem.Name = "redoToolStripMenuItem"; + this.redoToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Y))); + this.redoToolStripMenuItem.Size = new System.Drawing.Size(197, 26); + this.redoToolStripMenuItem.Text = "&Rétablir"; + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(194, 6); + // + // cutToolStripMenuItem + // + this.cutToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.cutToolStripMenuItem.Name = "cutToolStripMenuItem"; + this.cutToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.X))); + this.cutToolStripMenuItem.Size = new System.Drawing.Size(197, 26); + this.cutToolStripMenuItem.Text = "&Couper"; + this.cutToolStripMenuItem.Click += new System.EventHandler(this.cutToolStripMenuItem_Click); + // + // copyToolStripMenuItem + // + this.copyToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.copyToolStripMenuItem.Name = "copyToolStripMenuItem"; + this.copyToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C))); + this.copyToolStripMenuItem.Size = new System.Drawing.Size(197, 26); + this.copyToolStripMenuItem.Text = "Co&pier"; + this.copyToolStripMenuItem.Click += new System.EventHandler(this.copyToolStripMenuItem_Click); + // + // pasteToolStripMenuItem + // + this.pasteToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.pasteToolStripMenuItem.Name = "pasteToolStripMenuItem"; + this.pasteToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.V))); + this.pasteToolStripMenuItem.Size = new System.Drawing.Size(197, 26); + this.pasteToolStripMenuItem.Text = "Co&ller"; + this.pasteToolStripMenuItem.Click += new System.EventHandler(this.pasteToolStripMenuItem_Click); + // + // toolStripSeparator4 + // + this.toolStripSeparator4.Name = "toolStripSeparator4"; + this.toolStripSeparator4.Size = new System.Drawing.Size(194, 6); + // + // selectAllToolStripMenuItem + // + this.selectAllToolStripMenuItem.Name = "selectAllToolStripMenuItem"; + this.selectAllToolStripMenuItem.Size = new System.Drawing.Size(197, 26); + this.selectAllToolStripMenuItem.Text = "Sélectio&nner tout"; + this.selectAllToolStripMenuItem.Click += new System.EventHandler(this.selectAllToolStripMenuItem_Click); + // + // toolsToolStripMenuItem + // + this.toolsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.personalizeToolStripMenuItem, + this.optionsToolStripMenuItem}); + this.toolsToolStripMenuItem.Name = "toolsToolStripMenuItem"; + this.toolsToolStripMenuItem.Size = new System.Drawing.Size(59, 24); + this.toolsToolStripMenuItem.Text = "&Outils"; + // + // personalizeToolStripMenuItem + // + this.personalizeToolStripMenuItem.Name = "personalizeToolStripMenuItem"; + this.personalizeToolStripMenuItem.Size = new System.Drawing.Size(171, 26); + this.personalizeToolStripMenuItem.Text = "&Personnaliser"; + // + // optionsToolStripMenuItem + // + this.optionsToolStripMenuItem.Name = "optionsToolStripMenuItem"; + this.optionsToolStripMenuItem.Size = new System.Drawing.Size(171, 26); + this.optionsToolStripMenuItem.Text = "&Options"; + // + // languagetoolStripMenuItem + // + this.languagetoolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.frenchToolStripMenuItem, + this.englishToolStripMenuItem}); + this.languagetoolStripMenuItem.Name = "languagetoolStripMenuItem"; + this.languagetoolStripMenuItem.Size = new System.Drawing.Size(86, 24); + this.languagetoolStripMenuItem.Text = "Language"; + // + // frenchToolStripMenuItem + // + this.frenchToolStripMenuItem.Name = "frenchToolStripMenuItem"; + this.frenchToolStripMenuItem.Size = new System.Drawing.Size(137, 26); + this.frenchToolStripMenuItem.Text = "Français"; + this.frenchToolStripMenuItem.Click += new System.EventHandler(this.frenchToolStripMenuItem_Click); + // + // englishToolStripMenuItem + // + this.englishToolStripMenuItem.Name = "englishToolStripMenuItem"; + this.englishToolStripMenuItem.Size = new System.Drawing.Size(137, 26); + this.englishToolStripMenuItem.Text = "Anglais"; + this.englishToolStripMenuItem.Click += new System.EventHandler(this.englishToolStripMenuItem_Click); + // + // DisplayToolStripMenuItem + // + this.DisplayToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.SmallToolStripMenuItem, + this.MediumToolStripMenuItem, + this.LargeToolStripMenuItem}); + this.DisplayToolStripMenuItem.Name = "DisplayToolStripMenuItem"; + this.DisplayToolStripMenuItem.Size = new System.Drawing.Size(85, 24); + this.DisplayToolStripMenuItem.Text = "Affichage"; + // + // SmallToolStripMenuItem + // + this.SmallToolStripMenuItem.Checked = true; + this.SmallToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; + this.SmallToolStripMenuItem.Name = "SmallToolStripMenuItem"; + this.SmallToolStripMenuItem.Size = new System.Drawing.Size(129, 26); + this.SmallToolStripMenuItem.Text = "Petit"; + this.SmallToolStripMenuItem.Click += new System.EventHandler(this.SmallToolStripMenuItem_Click); + // + // MediumToolStripMenuItem + // + this.MediumToolStripMenuItem.Name = "MediumToolStripMenuItem"; + this.MediumToolStripMenuItem.Size = new System.Drawing.Size(129, 26); + this.MediumToolStripMenuItem.Text = "Moyen"; + this.MediumToolStripMenuItem.Click += new System.EventHandler(this.MediumToolStripMenuItem_Click); + // + // LargeToolStripMenuItem + // + this.LargeToolStripMenuItem.Name = "LargeToolStripMenuItem"; + this.LargeToolStripMenuItem.Size = new System.Drawing.Size(129, 26); + this.LargeToolStripMenuItem.Text = "Grand"; + this.LargeToolStripMenuItem.Click += new System.EventHandler(this.LargeToolStripMenuItem_Click); + // + // helpToolStripMenuItem + // + this.helpToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.summaryToolStripMenuItem, + this.indexToolStripMenuItem, + this.searchToolStripMenuItem, + this.toolStripSeparator5, + this.aboutToolStripMenuItem}); + this.helpToolStripMenuItem.Name = "helpToolStripMenuItem"; + this.helpToolStripMenuItem.Size = new System.Drawing.Size(52, 24); + this.helpToolStripMenuItem.Text = "&Aide"; + // + // summaryToolStripMenuItem + // + this.summaryToolStripMenuItem.Name = "summaryToolStripMenuItem"; + this.summaryToolStripMenuItem.Size = new System.Drawing.Size(175, 26); + this.summaryToolStripMenuItem.Text = "&Sommaire"; + // + // indexToolStripMenuItem + // + this.indexToolStripMenuItem.Name = "indexToolStripMenuItem"; + this.indexToolStripMenuItem.Size = new System.Drawing.Size(175, 26); + this.indexToolStripMenuItem.Text = "&Index"; + // + // searchToolStripMenuItem + // + this.searchToolStripMenuItem.Name = "searchToolStripMenuItem"; + this.searchToolStripMenuItem.Size = new System.Drawing.Size(175, 26); + this.searchToolStripMenuItem.Text = "&Rechercher"; + // + // toolStripSeparator5 + // + this.toolStripSeparator5.Name = "toolStripSeparator5"; + this.toolStripSeparator5.Size = new System.Drawing.Size(172, 6); + // + // aboutToolStripMenuItem + // + this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; + this.aboutToolStripMenuItem.Size = new System.Drawing.Size(175, 26); + this.aboutToolStripMenuItem.Text = "À &propos de..."; + this.aboutToolStripMenuItem.Click += new System.EventHandler(this.AboutToolStripMenuItem_Click); + // + // button1 + // + this.button1.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.button1.Location = new System.Drawing.Point(44, 130); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 37); + this.button1.TabIndex = 2; + this.button1.Text = "OCR"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // button2 + // + this.button2.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.button2.Location = new System.Drawing.Point(44, 44); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(140, 37); + this.button2.TabIndex = 3; + this.button2.Text = "Choose image"; + this.button2.UseVisualStyleBackColor = true; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // textBox1 + // + this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox1.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.textBox1.Location = new System.Drawing.Point(44, 93); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(1188, 26); + this.textBox1.TabIndex = 4; + this.textBox1.Text = "C:\\Users\\User\\Documents\\Visual Studio 2015\\Projects\\OpticalCharacterRecognition\\O" + + "pticalCharacterRecognition\\images\\sampleTest.PNG"; + // + // dataGridView1 + // + this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dataGridView1.Location = new System.Drawing.Point(44, 185); + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.RowTemplate.Height = 24; + this.dataGridView1.Size = new System.Drawing.Size(1188, 263); + this.dataGridView1.TabIndex = 5; + // + // FormMain + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1260, 534); + this.Controls.Add(this.dataGridView1); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Controls.Add(this.menuStrip1); + this.MainMenuStrip = this.menuStrip1; + this.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.Name = "FormMain"; + this.ShowIcon = false; + this.Text = "Optical Character Recognition"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormMainFormClosing); + this.Load += new System.EventHandler(this.FormMain_Load); + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private MenuStrip menuStrip1; + private ToolStripMenuItem fileToolStripMenuItem; + private ToolStripMenuItem newToolStripMenuItem; + private ToolStripMenuItem openToolStripMenuItem; + private ToolStripSeparator toolStripSeparator; + private ToolStripMenuItem saveToolStripMenuItem; + private ToolStripMenuItem saveasToolStripMenuItem; + private ToolStripSeparator toolStripSeparator1; + private ToolStripMenuItem printToolStripMenuItem; + private ToolStripMenuItem printPreviewToolStripMenuItem; + private ToolStripSeparator toolStripSeparator2; + private ToolStripMenuItem quitToolStripMenuItem; + private ToolStripMenuItem editToolStripMenuItem; + private ToolStripMenuItem cancelToolStripMenuItem; + private ToolStripMenuItem redoToolStripMenuItem; + private ToolStripSeparator toolStripSeparator3; + private ToolStripMenuItem cutToolStripMenuItem; + private ToolStripMenuItem copyToolStripMenuItem; + private ToolStripMenuItem pasteToolStripMenuItem; + private ToolStripSeparator toolStripSeparator4; + private ToolStripMenuItem selectAllToolStripMenuItem; + private ToolStripMenuItem toolsToolStripMenuItem; + private ToolStripMenuItem personalizeToolStripMenuItem; + private ToolStripMenuItem optionsToolStripMenuItem; + private ToolStripMenuItem helpToolStripMenuItem; + private ToolStripMenuItem summaryToolStripMenuItem; + private ToolStripMenuItem indexToolStripMenuItem; + private ToolStripMenuItem searchToolStripMenuItem; + private ToolStripSeparator toolStripSeparator5; + private ToolStripMenuItem aboutToolStripMenuItem; + private ToolStripMenuItem languagetoolStripMenuItem; + private ToolStripMenuItem frenchToolStripMenuItem; + private ToolStripMenuItem englishToolStripMenuItem; + private ToolStripMenuItem DisplayToolStripMenuItem; + private ToolStripMenuItem SmallToolStripMenuItem; + private ToolStripMenuItem MediumToolStripMenuItem; + private ToolStripMenuItem LargeToolStripMenuItem; + private Button button1; + private Button button2; + private TextBox textBox1; + private DataGridView dataGridView1; + } +} \ No newline at end of file diff --git a/OpticalCharacterRecognition/FormMain.cs b/OpticalCharacterRecognition/FormMain.cs new file mode 100644 index 0000000..27ee7a1 --- /dev/null +++ b/OpticalCharacterRecognition/FormMain.cs @@ -0,0 +1,712 @@ +/* +The MIT License(MIT) +Copyright(c) 2015 Freddy Juhel +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Windows.Forms; +using System.Xml.Linq; +using ImageRecognition; +using OpticalCharacterRecognition.Properties; + + +namespace OpticalCharacterRecognition +{ + public partial class FormMain : Form + { + public FormMain() + { + InitializeComponent(); + } + + readonly Dictionary _languageDicoEn = new Dictionary(); + readonly Dictionary _languageDicoFr = new Dictionary(); + private string _currentLanguage = "english"; + + private void QuitToolStripMenuItem_Click(object sender, EventArgs e) + { + SaveWindowValue(); + Application.Exit(); + } + + private void AboutToolStripMenuItem_Click(object sender, EventArgs e) + { + AboutBoxApplication aboutBoxApplication = new AboutBoxApplication(); + aboutBoxApplication.ShowDialog(); + } + + private void DisplayTitle() + { + Assembly assembly = Assembly.GetExecutingAssembly(); + FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location); + Text += string.Format(" V{0}.{1}.{2}.{3}", fvi.FileMajorPart, fvi.FileMinorPart, fvi.FileBuildPart, fvi.FilePrivatePart); + } + + private void FormMain_Load(object sender, EventArgs e) + { + LoadSettingsAtStartup(); + } + + private void LoadSettingsAtStartup() + { + DisplayTitle(); + GetWindowValue(); + LoadLanguages(); + SetLanguage(Settings.Default.LastLanguageUsed); + } + + private void LoadLanguages() + { + if (!File.Exists(Settings.Default.LanguageFileName)) + { + CreateLanguageFile(); + } + + // read the translation file and feed the language + XDocument xDoc = XDocument.Load(Settings.Default.LanguageFileName); + var result = from node in xDoc.Descendants("term") + where node.HasElements + let xElementName = node.Element("name") + where xElementName != null + let xElementEnglish = node.Element("englishValue") + where xElementEnglish != null + let xElementFrench = node.Element("frenchValue") + where xElementFrench != null + select new + { + name = xElementName.Value, + englishValue = xElementEnglish.Value, + frenchValue = xElementFrench.Value + }; + foreach (var i in result) + { + _languageDicoEn.Add(i.name, i.englishValue); + _languageDicoFr.Add(i.name, i.frenchValue); + } + } + + private static void CreateLanguageFile() + { + List minimumVersion = new List + { + "", + "", + "", + " 1.0 ", + "", + "", + "", + "MenuFile", + "File", + "Fichier", + "", + "", + "MenuFileNew", + "New", + "Nouveau", + "", + "", + "MenuFileOpen", + "Open", + "Ouvrir", + "", + "", + "MenuFileSave", + "Save", + "Enregistrer", + "", + "", + "MenuFileSaveAs", + "Save as ...", + "Enregistrer sous ...", + "", + "", + "MenuFilePrint", + "Print ...", + "Imprimer ...", + "", + "", + "MenufilePageSetup", + "Page setup", + "Aperçu avant impression", + "", + "", + "MenufileQuit", + "Quit", + "Quitter", + "", + "", + "MenuEdit", + "Edit", + "Edition", + "", + "", + "MenuEditCancel", + "Cancel", + "Annuler", + "", + "", + "MenuEditRedo", + "Redo", + "Rétablir", + "", + "", + "MenuEditCut", + "Cut", + "Couper", + "", + "", + "MenuEditCopy", + "Copy", + "Copier", + "", + "", + "MenuEditPaste", + "Paste", + "Coller", + "", + "", + "MenuEditSelectAll", + "Select All", + "Sélectionner tout", + "", + "", + "MenuTools", + "Tools", + "Outils", + "", + "", + "MenuToolsCustomize", + "Customize ...", + "Personaliser ...", + "", + "", + "MenuToolsOptions", + "Options", + "Options", + "", + "", + "MenuLanguage", + "Language", + "Langage", + "", + "", + "MenuLanguageEnglish", + "English", + "Anglais", + "", + "", + "MenuLanguageFrench", + "French", + "Français", + "", + "", + "MenuHelp", + "Help", + "Aide", + "", + "", + "MenuHelpSummary", + "Summary", + "Sommaire", + "", + "", + "MenuHelpIndex", + "Index", + "Index", + "", + "", + "MenuHelpSearch", + "Search", + "Rechercher", + "", + "", + "MenuHelpAbout", + "About", + "A propos de ...", + "", + "", + "" + }; + StreamWriter sw = new StreamWriter(Settings.Default.LanguageFileName); + foreach (string item in minimumVersion) + { + sw.WriteLine(item); + } + + sw.Close(); + } + + private void GetWindowValue() + { + Width = Settings.Default.WindowWidth; + Height = Settings.Default.WindowHeight; + Top = Settings.Default.WindowTop < 0 ? 0 : Settings.Default.WindowTop; + Left = Settings.Default.WindowLeft < 0 ? 0 : Settings.Default.WindowLeft; + SetDisplayOption(Settings.Default.DisplayToolStripMenuItem); + } + + private void SaveWindowValue() + { + Settings.Default.WindowHeight = Height; + Settings.Default.WindowWidth = Width; + Settings.Default.WindowLeft = Left; + Settings.Default.WindowTop = Top; + Settings.Default.LastLanguageUsed = frenchToolStripMenuItem.Checked ? "French" : "English"; + Settings.Default.DisplayToolStripMenuItem = GetDisplayOption(); + Settings.Default.Save(); + } + + private string GetDisplayOption() + { + if (SmallToolStripMenuItem.Checked) + { + return "Small"; + } + + if (MediumToolStripMenuItem.Checked) + { + return "Medium"; + } + + return LargeToolStripMenuItem.Checked ? "Large" : string.Empty; + + // incase of any other size options: + //if (LargeToolStripMenuItem.Checked) + //{ + // return "Large"; + //} + + //return string.Empty; + } + + private void SetDisplayOption(string option) + { + UncheckAllOptions(); + switch (option.ToLower()) + { + case "small": + SmallToolStripMenuItem.Checked = true; + break; + case "medium": + MediumToolStripMenuItem.Checked = true; + break; + case "large": + LargeToolStripMenuItem.Checked = true; + break; + default: + SmallToolStripMenuItem.Checked = true; + break; + } + } + + private void UncheckAllOptions() + { + SmallToolStripMenuItem.Checked = false; + MediumToolStripMenuItem.Checked = false; + LargeToolStripMenuItem.Checked = false; + } + + private void FormMainFormClosing(object sender, FormClosingEventArgs e) + { + SaveWindowValue(); + } + + private void frenchToolStripMenuItem_Click(object sender, EventArgs e) + { + _currentLanguage = Language.French.ToString(); + SetLanguage(Language.French.ToString()); + AdjustAllControls(); + } + + private void englishToolStripMenuItem_Click(object sender, EventArgs e) + { + _currentLanguage = Language.English.ToString(); + SetLanguage(Language.English.ToString()); + AdjustAllControls(); + } + + private void SetLanguage(string myLanguage) + { + switch (myLanguage) + { + case "English": + frenchToolStripMenuItem.Checked = false; + englishToolStripMenuItem.Checked = true; + fileToolStripMenuItem.Text = _languageDicoEn["MenuFile"]; + newToolStripMenuItem.Text = _languageDicoEn["MenuFileNew"]; + openToolStripMenuItem.Text = _languageDicoEn["MenuFileOpen"]; + saveToolStripMenuItem.Text = _languageDicoEn["MenuFileSave"]; + saveasToolStripMenuItem.Text = _languageDicoEn["MenuFileSaveAs"]; + printPreviewToolStripMenuItem.Text = _languageDicoEn["MenuFilePrint"]; + printPreviewToolStripMenuItem.Text = _languageDicoEn["MenufilePageSetup"]; + quitToolStripMenuItem.Text = _languageDicoEn["MenufileQuit"]; + editToolStripMenuItem.Text = _languageDicoEn["MenuEdit"]; + cancelToolStripMenuItem.Text = _languageDicoEn["MenuEditCancel"]; + redoToolStripMenuItem.Text = _languageDicoEn["MenuEditRedo"]; + cutToolStripMenuItem.Text = _languageDicoEn["MenuEditCut"]; + copyToolStripMenuItem.Text = _languageDicoEn["MenuEditCopy"]; + pasteToolStripMenuItem.Text = _languageDicoEn["MenuEditPaste"]; + selectAllToolStripMenuItem.Text = _languageDicoEn["MenuEditSelectAll"]; + toolsToolStripMenuItem.Text = _languageDicoEn["MenuTools"]; + personalizeToolStripMenuItem.Text = _languageDicoEn["MenuToolsCustomize"]; + optionsToolStripMenuItem.Text = _languageDicoEn["MenuToolsOptions"]; + languagetoolStripMenuItem.Text = _languageDicoEn["MenuLanguage"]; + englishToolStripMenuItem.Text = _languageDicoEn["MenuLanguageEnglish"]; + frenchToolStripMenuItem.Text = _languageDicoEn["MenuLanguageFrench"]; + helpToolStripMenuItem.Text = _languageDicoEn["MenuHelp"]; + summaryToolStripMenuItem.Text = _languageDicoEn["MenuHelpSummary"]; + indexToolStripMenuItem.Text = _languageDicoEn["MenuHelpIndex"]; + searchToolStripMenuItem.Text = _languageDicoEn["MenuHelpSearch"]; + aboutToolStripMenuItem.Text = _languageDicoEn["MenuHelpAbout"]; + DisplayToolStripMenuItem.Text = _languageDicoEn["Display"]; + SmallToolStripMenuItem.Text = _languageDicoEn["Small"]; + MediumToolStripMenuItem.Text = _languageDicoEn["Medium"]; + LargeToolStripMenuItem.Text = _languageDicoEn["Large"]; + + _currentLanguage = "English"; + break; + case "French": + frenchToolStripMenuItem.Checked = true; + englishToolStripMenuItem.Checked = false; + fileToolStripMenuItem.Text = _languageDicoFr["MenuFile"]; + newToolStripMenuItem.Text = _languageDicoFr["MenuFileNew"]; + openToolStripMenuItem.Text = _languageDicoFr["MenuFileOpen"]; + saveToolStripMenuItem.Text = _languageDicoFr["MenuFileSave"]; + saveasToolStripMenuItem.Text = _languageDicoFr["MenuFileSaveAs"]; + printPreviewToolStripMenuItem.Text = _languageDicoFr["MenuFilePrint"]; + printPreviewToolStripMenuItem.Text = _languageDicoFr["MenufilePageSetup"]; + quitToolStripMenuItem.Text = _languageDicoFr["MenufileQuit"]; + editToolStripMenuItem.Text = _languageDicoFr["MenuEdit"]; + cancelToolStripMenuItem.Text = _languageDicoFr["MenuEditCancel"]; + redoToolStripMenuItem.Text = _languageDicoFr["MenuEditRedo"]; + cutToolStripMenuItem.Text = _languageDicoFr["MenuEditCut"]; + copyToolStripMenuItem.Text = _languageDicoFr["MenuEditCopy"]; + pasteToolStripMenuItem.Text = _languageDicoFr["MenuEditPaste"]; + selectAllToolStripMenuItem.Text = _languageDicoFr["MenuEditSelectAll"]; + toolsToolStripMenuItem.Text = _languageDicoFr["MenuTools"]; + personalizeToolStripMenuItem.Text = _languageDicoFr["MenuToolsCustomize"]; + optionsToolStripMenuItem.Text = _languageDicoFr["MenuToolsOptions"]; + languagetoolStripMenuItem.Text = _languageDicoFr["MenuLanguage"]; + englishToolStripMenuItem.Text = _languageDicoFr["MenuLanguageEnglish"]; + frenchToolStripMenuItem.Text = _languageDicoFr["MenuLanguageFrench"]; + helpToolStripMenuItem.Text = _languageDicoFr["MenuHelp"]; + summaryToolStripMenuItem.Text = _languageDicoFr["MenuHelpSummary"]; + indexToolStripMenuItem.Text = _languageDicoFr["MenuHelpIndex"]; + searchToolStripMenuItem.Text = _languageDicoFr["MenuHelpSearch"]; + aboutToolStripMenuItem.Text = _languageDicoFr["MenuHelpAbout"]; + DisplayToolStripMenuItem.Text = _languageDicoFr["Display"]; + SmallToolStripMenuItem.Text = _languageDicoFr["Small"]; + MediumToolStripMenuItem.Text = _languageDicoFr["Medium"]; + LargeToolStripMenuItem.Text = _languageDicoFr["Large"]; + + _currentLanguage = "French"; + break; + default: + SetLanguage("English"); + break; + } + } + + private void cutToolStripMenuItem_Click(object sender, EventArgs e) + { + Control focusedControl = FindFocusedControl(new List()); // add your controls in the List + var tb = focusedControl as TextBox; + if (tb != null) + { + CutToClipboard(tb); + } + } + + private void copyToolStripMenuItem_Click(object sender, EventArgs e) + { + Control focusedControl = FindFocusedControl(new List()); // add your controls in the List + var tb = focusedControl as TextBox; + if (tb != null) + { + CopyToClipboard(tb); + } + } + + private void pasteToolStripMenuItem_Click(object sender, EventArgs e) + { + Control focusedControl = FindFocusedControl(new List()); // add your controls in the List + var tb = focusedControl as TextBox; + if (tb != null) + { + PasteFromClipboard(tb); + } + } + + private void selectAllToolStripMenuItem_Click(object sender, EventArgs e) + { + Control focusedControl = FindFocusedControl(new List()); // add your controls in the List + TextBox control = focusedControl as TextBox; + control?.SelectAll(); + } + + private void CutToClipboard(TextBoxBase tb, string errorMessage = "nothing") + { + if (tb != ActiveControl) return; + if (tb.Text == string.Empty) + { + DisplayMessage(Translate("ThereIs") + Punctuation.OneSpace + + Translate(errorMessage) + Punctuation.OneSpace + + Translate("ToCut") + Punctuation.OneSpace, Translate(errorMessage), + MessageBoxButtons.OK); + return; + } + + if (tb.SelectedText == string.Empty) + { + DisplayMessage(Translate("NoTextHasBeenSelected"), + Translate(errorMessage), MessageBoxButtons.OK); + return; + } + + Clipboard.SetText(tb.SelectedText); + tb.SelectedText = string.Empty; + } + + private void CopyToClipboard(TextBoxBase tb, string message = "nothing") + { + if (tb != ActiveControl) return; + if (tb.Text == string.Empty) + { + DisplayMessage(Translate("ThereIsNothingToCopy") + Punctuation.OneSpace, + Translate(message), MessageBoxButtons.OK); + return; + } + + if (tb.SelectedText == string.Empty) + { + DisplayMessage(Translate("NoTextHasBeenSelected"), + Translate(message), MessageBoxButtons.OK); + return; + } + + Clipboard.SetText(tb.SelectedText); + } + + private void PasteFromClipboard(TextBoxBase tb) + { + if (tb != ActiveControl) return; + var selectionIndex = tb.SelectionStart; + tb.Text = tb.Text.Insert(selectionIndex, Clipboard.GetText()); + tb.SelectionStart = selectionIndex + Clipboard.GetText().Length; + } + + private void DisplayMessage(string message, string title, MessageBoxButtons buttons) + { + MessageBox.Show(this, message, title, buttons); + } + + private string Translate(string index) + { + string result = string.Empty; + switch (_currentLanguage.ToLower()) + { + case "english": + result = _languageDicoEn.ContainsKey(index) ? _languageDicoEn[index] : + "the term: \"" + index + "\" has not been translated yet.\nPlease tell the developer to translate this term"; + break; + case "french": + result = _languageDicoFr.ContainsKey(index) ? _languageDicoFr[index] : + "the term: \"" + index + "\" has not been translated yet.\nPlease tell the developer to translate this term"; + break; + } + + return result; + } + + private static Control FindFocusedControl(Control container) + { + foreach (Control childControl in container.Controls.Cast().Where(childControl => childControl.Focused)) + { + return childControl; + } + + return (from Control childControl in container.Controls + select FindFocusedControl(childControl)).FirstOrDefault(maybeFocusedControl => maybeFocusedControl != null); + } + + private static Control FindFocusedControl(IEnumerable container) + { + return container.FirstOrDefault(control => control.Focused); + } + + private static Control FindFocusedControl(List container) + { + return container.FirstOrDefault(control => control.Focused); + } + + private static Control FindFocusedControl(params Control[] container) + { + return container.FirstOrDefault(control => control.Focused); + } + + private static string ChooseDirectory() + { + string result = string.Empty; + FolderBrowserDialog fbd = new FolderBrowserDialog(); + if (fbd.ShowDialog() == DialogResult.OK) + { + result = fbd.SelectedPath; + } + + return result; + } + + private void SmallToolStripMenuItem_Click(object sender, EventArgs e) + { + UncheckAllOptions(); + SmallToolStripMenuItem.Checked = true; + AdjustAllControls(); + } + + private void MediumToolStripMenuItem_Click(object sender, EventArgs e) + { + UncheckAllOptions(); + MediumToolStripMenuItem.Checked = true; + AdjustAllControls(); + } + + private void LargeToolStripMenuItem_Click(object sender, EventArgs e) + { + UncheckAllOptions(); + LargeToolStripMenuItem.Checked = true; + AdjustAllControls(); + } + + private static void AdjustControls(params Control[] listOfControls) + { + if (listOfControls.Length == 0) + { + return; + } + + int position = listOfControls[0].Width + 33; // 33 is the initial padding + bool isFirstControl = true; + foreach (Control control in listOfControls) + { + if (isFirstControl) + { + isFirstControl = false; + } + else + { + control.Left = position + 10; + position += control.Width; + } + } + } + + private static void AdjustAllControls() + { + AdjustControls(); + } + + private void button2_Click(object sender, EventArgs e) + { + OpenFileDialog openFileDialog = new OpenFileDialog(); + openFileDialog.Title = "Open File Dialog"; + openFileDialog.InitialDirectory = "c:\\"; + openFileDialog.Filter = "All files (*.*)|*.*|All files (*.*)|*.*"; + openFileDialog.FilterIndex = 2; + openFileDialog.RestoreDirectory = true; + if (openFileDialog.ShowDialog() != DialogResult.OK) + return; + textBox1.Text = openFileDialog.FileName; + } + + private void BindToGridWords(IEnumerable wordInfos) + { + DataTable dataTable = new DataTable(); + PropertyInfo[] properties = typeof(WordInfo).GetProperties(); + foreach (PropertyInfo propertyInfo in properties) + { + if (propertyInfo.Name != "CharacterInfo") + dataTable.Columns.Add(propertyInfo.Name); + } + foreach (WordInfo wordInfo in wordInfos) + { + DataRow row = dataTable.NewRow(); + foreach (PropertyInfo propertyInfo in properties) + { + if (propertyInfo.Name == "Color") + { + PxColor pxColor = (PxColor)typeof(WordInfo).GetProperty(propertyInfo.Name).GetValue((object)wordInfo, null); + //was row[propertyInfo.Name] = (string)(object)pxColor.R + (object)"," + (string)(object)pxColor.G + "," + (string)(object)pxColor.B; + row[propertyInfo.Name] = pxColor.R + "," + pxColor.G + "," + pxColor.B; + } + else if (propertyInfo.Name != "CharacterInfo") + row[propertyInfo.Name] = typeof(WordInfo).GetProperty(propertyInfo.Name).GetValue((object)wordInfo, null); + } + dataTable.Rows.Add(row); + } + + dataGridView1.DataSource = dataTable; + } + + private void BindToGridEvents(IEnumerable eventInfos) + { + DataTable dataTable = new DataTable(); + PropertyInfo[] properties = typeof(EventInfo).GetProperties(); + foreach (PropertyInfo propertyInfo in properties) + { + if (propertyInfo.Name != "CharacterInfo") + dataTable.Columns.Add(propertyInfo.Name); + } + foreach (EventInfo eventInfo in eventInfos) + { + DataRow row = dataTable.NewRow(); + foreach (PropertyInfo propertyInfo in properties) + { + if (propertyInfo.Name == "Color") + { + PxColor pxColor = (PxColor)typeof(EventInfo).GetProperty(propertyInfo.Name).GetValue(eventInfo, null); + row[propertyInfo.Name] = (string)(object)pxColor.R + (object)"," + (string)(object)pxColor.G + "," + (string)(object)pxColor.B; + } + else if (propertyInfo.Name != "CharacterInfo") + row[propertyInfo.Name] = typeof(EventInfo).GetProperty(propertyInfo.Name).GetValue(eventInfo, null); + } + dataTable.Rows.Add(row); + } + + dataGridView1.DataSource = dataTable; + } + + private void button1_Click(object sender, EventArgs e) + { + Bitmap bitmap = new Bitmap(textBox1.Text); + ImageAnalyzer imageAnalyzer = new ImageAnalyzer(); + DateTime now = DateTime.Now; + List list = imageAnalyzer.HorizontalWord(bitmap); + //Console.WriteLine(" Algorithm execution time {0} miliseconds ", (object)DateTime.Now.Subtract(now).TotalMilliseconds); + BindToGridWords((IEnumerable)list); + } + } +} \ No newline at end of file diff --git a/OpticalCharacterRecognition/FormMain.resx b/OpticalCharacterRecognition/FormMain.resx new file mode 100644 index 0000000..d5494e3 --- /dev/null +++ b/OpticalCharacterRecognition/FormMain.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/OpticalCharacterRecognition/ImageRecognition.dll b/OpticalCharacterRecognition/ImageRecognition.dll new file mode 100644 index 0000000..4cf3f01 Binary files /dev/null and b/OpticalCharacterRecognition/ImageRecognition.dll differ diff --git a/OpticalCharacterRecognition/Language.cs b/OpticalCharacterRecognition/Language.cs new file mode 100644 index 0000000..30682e4 --- /dev/null +++ b/OpticalCharacterRecognition/Language.cs @@ -0,0 +1,27 @@ +/* +The MIT License(MIT) +Copyright(c) 2015 Freddy Juhel +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ +namespace OpticalCharacterRecognition +{ + public enum Language + { + French, + English + } +} \ No newline at end of file diff --git a/OpticalCharacterRecognition/OpticalCharacterRecognition.csproj b/OpticalCharacterRecognition/OpticalCharacterRecognition.csproj new file mode 100644 index 0000000..f75ecd1 --- /dev/null +++ b/OpticalCharacterRecognition/OpticalCharacterRecognition.csproj @@ -0,0 +1,124 @@ + + + + + Debug + AnyCPU + {B492FE99-F506-48C7-8D6D-B35C2CDEF668} + WinExe + Properties + OpticalCharacterRecognition + OpticalCharacterRecognition + v4.5.1 + 512 + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + OpticalCharacterRecognition.Program + + + + + + + + + + + + + + + + Form + + + AboutBoxApplication.cs + + + Form + + + FormMain.cs + + + + + + + AboutBoxApplication.cs + + + FormMain.cs + Designer + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + Always + + + + + Always + + + Always + + + + + {2ddc7187-07b6-4aa7-b193-5073a24fb50e} + ImageRecognition + + + + + \ No newline at end of file diff --git a/OpticalCharacterRecognition/PixelFormat.xml b/OpticalCharacterRecognition/PixelFormat.xml new file mode 100644 index 0000000..4d349aa --- /dev/null +++ b/OpticalCharacterRecognition/PixelFormat.xml @@ -0,0 +1,730 @@ + + + + + + + + A + (0,5)(0,6)(0,7)(1,2)(1,3)(1,4)(1,5)(2,0)(2,1)(2,5)(3,0)(3,1)(3,5)(4,2)(4,3)(4,4)(4,5)(5,5)(5,6)(5,7) + + + B + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(1,0)(1,3)(1,7)(2,0)(2,3)(2,7)(3,0)(3,3)(3,7)(4,1)(4,2)(4,3)(4,7)(5,4)(5,5)(5,6) + + + C + (0,2)(0,3)(0,4)(0,5)(1,1)(1,6)(2,0)(2,7)(3,0)(3,7)(4,0)(4,7)(5,0)(5,7)(6,1)(6,6) + + + D + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(1,0)(1,7)(2,0)(2,7)(3,0)(3,7)(4,0)(4,7)(5,1)(5,6)(6,2)(6,3)(6,4)(6,5) + + + E + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(1,0)(1,3)(1,7)(2,0)(2,3)(2,7)(3,0)(3,3)(3,7)(4,0)(4,3)(4,7) + + + F + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(1,0)(1,3)(2,0)(2,3)(3,0)(3,3)(4,0) + + + G + (0,2)(0,3)(0,4)(0,5)(1,1)(1,6)(2,0)(2,7)(3,0)(3,7)(4,0)(4,4)(4,7)(5,0)(5,4)(5,7)(6,1)(6,4)(6,5)(6,6) + + + H + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(1,3)(2,3)(3,3)(4,3)(5,0)(5,1)(5,2)(5,3)(5,4)(5,5)(5,6)(5,7) + + + I + (0,0)(0,7)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(2,0)(2,7) + + + J + (0,7)(1,0)(1,7)(2,0)(2,7)(3,0)(3,1)(3,2)(3,3)(3,4)(3,5)(3,6) + + + K + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(1,4)(2,3)(2,4)(3,2)(3,5)(4,1)(4,6)(5,0)(5,7) + + + L + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(1,7)(2,7)(3,7)(4,7) + + + M + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(1,0)(1,1)(2,2)(2,3)(3,4)(3,5)(4,2)(4,3)(5,0)(5,1)(6,0)(6,1)(6,2)(6,3)(6,4)(6,5)(6,6)(6,7) + + + N + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(1,0)(1,1)(2,2)(2,3)(3,4)(3,5)(4,6)(4,7)(5,0)(5,1)(5,2)(5,3)(5,4)(5,5)(5,6)(5,7) + + + O + (0,2)(0,3)(0,4)(0,5)(1,1)(1,6)(2,0)(2,7)(3,0)(3,7)(4,0)(4,7)(5,1)(5,6)(6,2)(6,3)(6,4)(6,5) + + + P + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(1,0)(1,4)(2,0)(2,4)(3,0)(3,4)(4,1)(4,2)(4,3) + + + Q + (0,2)(0,3)(0,4)(0,5)(1,1)(1,6)(2,0)(2,7)(3,0)(3,7)(4,0)(4,7)(4,8)(5,1)(5,6)(5,9)(6,2)(6,3)(6,4)(6,5)(6,9) + + + R + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(1,0)(1,4)(2,0)(2,4)(3,0)(3,4)(3,5)(4,1)(4,2)(4,3)(4,6)(5,7) + + + S + (0,1)(0,2)(0,6)(1,0)(1,3)(1,7)(2,0)(2,3)(2,7)(3,0)(3,4)(3,7)(4,0)(4,4)(4,7)(5,1)(5,5)(5,6) + + + T + (0,0)(1,0)(2,0)(3,0)(3,1)(3,2)(3,3)(3,4)(3,5)(3,6)(3,7)(4,0)(5,0)(6,0) + + + U + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(1,7)(2,7)(3,7)(4,7)(5,0)(5,1)(5,2)(5,3)(5,4)(5,5)(5,6) + + + V + (0,0)(0,1)(0,2)(1,3)(1,4)(1,5)(2,6)(2,7)(3,6)(3,7)(4,3)(4,4)(4,5)(5,0)(5,1)(5,2) + + + W + (0,0)(0,1)(1,2)(1,3)(1,4)(1,5)(2,6)(2,7)(3,2)(3,3)(3,4)(3,5)(4,0)(4,1)(5,2)(5,3)(5,4)(5,5)(6,6)(6,7)(7,2)(7,3)(7,4)(7,5)(8,0)(8,1) + + + X + (0,0)(0,1)(0,6)(0,7)(1,2)(1,5)(2,3)(2,4)(3,3)(3,4)(4,2)(4,5)(5,0)(5,1)(5,6)(5,7) + + + Y + (0,0)(1,1)(2,2)(3,3)(3,4)(3,5)(3,6)(3,7)(4,2)(5,1)(6,0) + + + Z + (0,0)(0,6)(0,7)(1,0)(1,5)(1,7)(2,0)(2,4)(2,7)(3,0)(3,3)(3,7)(4,0)(4,2)(4,7)(5,0)(5,1)(5,7) + + + + + A + (0,5)(0,6)(0,7)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(2,0)(2,1)(2,2)(2,3)(2,4)(2,5)(3,0)(3,1)(3,5)(4,0)(4,1)(4,2)(4,3)(4,4)(4,5)(5,2)(5,3)(5,4)(5,5)(5,6)(5,7)(6,5)(6,6)(6,7) + + + B + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(2,0)(2,3)(2,7)(3,0)(3,3)(3,7)(4,0)(4,1)(4,2)(4,3)(4,4)(4,5)(4,6)(4,7)(5,1)(5,2)(5,4)(5,5)(5,6) + + + C + (0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(2,0)(2,7)(3,0)(3,7)(4,0)(4,7)(5,1)(5,6) + + + D + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(2,0)(2,7)(3,0)(3,7)(4,0)(4,1)(4,6)(4,7)(5,1)(5,2)(5,3)(5,4)(5,5)(5,6)(6,2)(6,3)(6,4)(6,5) + + + E + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(2,0)(2,3)(2,7)(3,0)(3,3)(3,7)(4,0)(4,3)(4,7)(5,0)(5,3)(5,7) + + + F + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(2,0)(2,3)(3,0)(3,3)(4,0)(4,3)(5,0)(5,3) + + + G + (0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(2,0)(2,7)(3,0)(3,7)(4,0)(4,4)(4,7)(5,0)(5,4)(5,5)(5,6)(5,7)(6,1)(6,4)(6,5)(6,6)(6,7) + + + H + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(2,3)(3,3)(4,3)(5,0)(5,1)(5,2)(5,3)(5,4)(5,5)(5,6)(5,7)(6,0)(6,1)(6,2)(6,3)(6,4)(6,5)(6,6)(6,7) + + + I + (0,0)(0,7)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(2,0)(2,1)(2,2)(2,3)(2,4)(2,5)(2,6)(2,7)(3,0)(3,7) + + + J + (0,7)(1,0)(1,7)(2,0)(2,7)(3,0)(3,1)(3,2)(3,3)(3,4)(3,5)(3,6)(3,7)(4,0)(4,1)(4,2)(4,3)(4,4)(4,5)(4,6) + + + K + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(2,2)(2,3)(2,4)(2,5)(3,1)(3,2)(3,5)(3,6)(4,0)(4,1)(4,6)(4,7)(5,0)(5,7) + + + L + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(2,7)(3,7)(4,7)(5,7) + + + M + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(1,0)(1,1)(1,2)(2,1)(2,2)(2,3)(3,2)(3,3)(3,4)(4,3)(5,2)(6,1)(6,2)(6,3)(6,4)(6,5)(6,6)(6,7)(7,0)(7,1)(7,2)(7,3)(7,4)(7,5)(7,6)(7,7) + + + N + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(1,1)(1,2)(2,2)(2,3)(3,3)(3,4)(4,4)(4,5)(5,5)(5,6)(6,0)(6,1)(6,2)(6,3)(6,4)(6,5)(6,6)(6,7) + + + O + (0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(2,0)(2,7)(3,0)(3,7)(4,0)(4,7)(5,0)(5,1)(5,2)(5,3)(5,4)(5,5)(5,6)(5,7)(6,1)(6,2)(6,3)(6,4)(6,5)(6,6) + + + P + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(2,0)(2,4)(3,0)(3,4)(4,0)(4,1)(4,2)(4,3)(4,4)(5,1)(5,2)(5,3) + + + Q + (0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(2,0)(2,7)(3,0)(3,7)(3,8)(4,0)(4,7)(4,8)(4,9)(5,0)(5,1)(5,2)(5,3)(5,4)(5,5)(5,6)(5,7)(5,9)(6,1)(6,2)(6,3)(6,4)(6,5)(6,6)(6,9) + + + + R + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(2,0)(2,4)(3,0)(3,4)(3,5)(4,0)(4,1)(4,2)(4,3)(4,4)(4,5)(4,6)(5,1)(5,2)(5,3)(5,6)(5,7)(6,7) + + + S + (0,1)(0,2)(0,3)(0,6)(1,0)(1,1)(1,2)(1,3)(1,4)(1,7)(2,0)(2,3)(2,4)(2,7)(3,0)(3,3)(3,4)(3,7)(4,0)(4,3)(4,4)(4,5)(4,6)(4,7)(5,1)(5,4)(5,5)(5,6) + + + T + (0,0)(1,0)(2,0)(3,0)(3,1)(3,2)(3,3)(3,4)(3,5)(3,6)(3,7)(4,0)(4,1)(4,2)(4,3)(4,4)(4,5)(4,6)(4,7)(5,0)(6,0)(7,0) + + + U + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(2,7)(3,7)(4,7)(5,0)(5,1)(5,2)(5,3)(5,4)(5,5)(5,6)(5,7)(6,0)(6,1)(6,2)(6,3)(6,4)(6,5)(6,6) + + + V + (0,0)(0,1)(0,2)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(2,3)(2,4)(2,5)(2,6)(2,7)(3,3)(3,4)(3,5)(3,6)(3,7)(4,0)(4,1)(4,2)(4,3)(4,4)(4,5)(5,0)(5,1)(5,2) + + + W + (0,0)(0,1)(0,2)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(2,3)(2,4)(2,5)(2,6)(2,7)(3,4)(3,5)(3,6)(3,7)(4,0)(4,1)(4,2)(4,3)(4,4)(5,0)(5,1)(5,2)(5,3)(5,4)(6,4)(6,5)(6,6)(6,7)(7,3)(7,4)(7,5)(7,6)(7,7)(8,0)(8,1)(8,2)(8,3)(8,4)(8,5)(9,0)(9,1)(9,2) + + + X + (0,0)(0,1)(0,6)(0,7)(1,0)(1,1)(1,2)(1,5)(1,6)(1,7)(2,2)(2,3)(2,4)(2,5)(3,2)(3,3)(3,4)(3,5)(4,0)(4,1)(4,2)(4,5)(4,6)(4,7)(5,0)(5,1)(5,6)(5,7) + + + Y + (0,0)(0,1)(1,0)(1,1)(1,2)(1,3)(2,2)(2,3)(2,4)(2,5)(2,6)(2,7)(3,2)(3,3)(3,4)(3,5)(3,6)(3,7)(4,0)(4,1)(4,2)(4,3)(5,0)(5,1) + + + Z + (0,0)(0,5)(0,6)(0,7)(1,0)(1,4)(1,5)(1,6)(1,7)(2,0)(2,3)(2,4)(2,5)(2,7)(3,0)(3,2)(3,3)(3,4)(3,7)(4,0)(4,1)(4,2)(4,3)(4,7)(5,0)(5,1)(5,2)(5,7) + + + + + + + a + (0,3)(0,4)(1,0)(1,2)(1,5)(2,0)(2,2)(2,5)(3,0)(3,2)(3,5)(4,1)(4,2)(4,3)(4,4)(4,5) + + + b + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(0,8)(1,3)(1,8)(2,3)(2,8)(3,3)(3,8)(4,4)(4,5)(4,6)(4,7) + + + c + (0,1)(0,2)(0,3)(0,4)(1,0)(1,5)(2,0)(2,5)(3,0)(3,5)(4,1)(4,4) + + + d + (0,4)(0,5)(0,6)(0,7)(1,3)(1,8)(2,3)(2,8)(3,3)(3,8)(4,0)(4,1)(4,2)(4,3)(4,4)(4,5)(4,6)(4,7)(4,8) + + + e + (0,1)(0,2)(0,3)(0,4)(1,0)(1,2)(1,5)(2,0)(2,2)(2,5)(3,0)(3,2)(3,5)(4,1)(4,2)(4,4) + + + f + (0,3)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(1,8)(2,0)(2,3)(3,0)(3,3) + + + g + (0,1)(0,2)(0,3)(0,4)(1,0)(1,5)(1,7)(2,0)(2,5)(2,7)(3,0)(3,5)(3,7)(4,0)(4,1)(4,2)(4,3)(4,4)(4,5)(4,6) + + + h + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(0,8)(1,3)(2,3)(3,3)(4,4)(4,5)(4,6)(4,7)(4,8) + + + i + (0,0)(0,3)(0,4)(0,5)(0,6)(0,7)(0,8) + + + j + + + + k + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(0,8)(1,6)(2,5)(2,6)(3,4)(3,7)(4,3)(4,8) + + + l + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(0,8) + + + m + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(1,0)(2,0)(3,0)(4,1)(4,2)(4,3)(4,4)(4,5)(5,0)(6,0)(7,0)(8,1)(8,2)(8,3)(8,4)(8,5) + + + n + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(1,0)(2,0)(3,0)(4,1)(4,2)(4,3)(4,4)(4,5) + + + o + (0,1)(0,2)(0,3)(0,4)(1,0)(1,5)(2,0)(2,5)(3,0)(3,5)(4,1)(4,2)(4,3)(4,4) + + + p + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(1,0)(1,5)(2,0)(2,5)(3,0)(3,5)(4,1)(4,2)(4,3)(4,4) + + + q + (0,1)(0,2)(0,3)(0,4)(1,0)(1,5)(2,0)(2,5)(3,0)(3,5)(4,0)(4,1)(4,2)(4,3)(4,4)(4,5)(4,6)(4,7) + + + + r + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(1,1)(2,0)(3,0) + + + s + (0,1)(0,2)(0,5)(1,0)(1,2)(1,5)(2,0)(2,3)(2,5)(3,0)(3,3)(3,4) + + + t + (0,2)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(2,2)(2,7)(3,2)(3,7) + + + u + (0,0)(0,1)(0,2)(0,3)(0,4)(1,5)(2,5)(3,5)(4,0)(4,1)(4,2)(4,3)(4,4)(4,5) + + + v + (0,0)(0,1)(1,2)(1,3)(2,4)(2,5)(3,2)(3,3)(4,0)(4,1) + + + w + (0,0)(0,1)(0,2)(0,3)(1,4)(1,5)(2,2)(2,3)(3,0)(3,1)(4,2)(4,3)(5,4)(5,5)(6,0)(6,1)(6,2)(6,3) + + + x + (0,0)(0,5)(1,1)(1,4)(2,2)(2,3)(3,1)(3,4)(4,0)(4,5) + + + y + (0,0)(1,1)(1,2)(1,3)(1,7)(2,4)(2,5)(2,6)(3,1)(3,2)(3,3)(4,0) + + + z + (0,0)(0,4)(0,5)(1,0)(1,3)(1,5)(2,0)(2,2)(2,5)(3,0)(3,1)(3,5) + + + + + a + (0,3)(0,4)(1,0)(1,2)(1,3)(1,4)(1,5)(2,0)(2,2)(2,5)(3,0)(3,2)(3,5)(4,0)(4,1)(4,2)(4,3)(4,4)(4,5)(5,1)(5,2)(5,3)(5,4)(5,5) + + + b + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(0,8)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(1,8)(2,3)(2,8)(3,3)(3,8)(4,3)(4,4)(4,5)(4,6)(4,7)(4,8)(5,4)(5,5)(5,6)(5,7) + + + c + (0,1)(0,2)(0,3)(0,4)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(2,0)(2,5)(3,0)(3,5)(4,0)(4,5) + + + d + (0,4)(0,5)(0,6)(0,7)(1,3)(1,4)(1,5)(1,6)(1,7)(1,8)(2,3)(2,8)(3,3)(3,8)(4,0)(4,1)(4,2)(4,3)(4,4)(4,5)(4,6)(4,7)(4,8)(5,0)(5,1)(5,2)(5,3)(5,4)(5,5)(5,6)(5,7)(5,8) + + + e + (0,1)(0,2)(0,3)(0,4)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(2,0)(2,2)(2,5)(3,0)(3,2)(3,5)(4,0)(4,1)(4,2)(4,5)(5,1)(5,2)(5,4) + + + f + (0,3)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(1,8)(2,0)(2,1)(2,2)(2,3)(2,4)(2,5)(2,6)(2,7)(2,8)(3,0)(3,3)(4,0)(4,3) + + + g + (0,1)(0,2)(0,3)(0,4)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,7)(2,0)(2,5)(2,7)(3,0)(3,5)(3,7)(4,0)(4,1)(4,2)(4,3)(4,4)(4,5)(4,6)(4,7)(5,0)(5,1)(5,2)(5,3)(5,4)(5,5)(5,6) + + + h + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(0,8)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(1,8)(2,3)(3,3)(4,3)(4,4)(4,5)(4,6)(4,7)(4,8)(5,4)(5,5)(5,6)(5,7)(5,8) + + + i + (0,0)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(1,0)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7) + + + j + + + + k + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(0,8)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(1,8)(2,5)(2,6)(3,4)(3,5)(3,6)(3,7)(4,3)(4,4)(4,7)(4,8)(5,3)(5,8) + + + l + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(0,8)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(1,8) + + + m + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(2,0)(3,0)(4,0)(4,1)(4,2)(4,3)(4,4)(4,5)(5,1)(5,2)(5,3)(5,4)(5,5)(6,0)(7,0)(8,0)(8,1)(8,2)(8,3)(8,4)(8,5)(9,1)(9,2)(9,3)(9,4)(9,5) + + + n + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(2,0)(3,0)(4,0)(4,1)(4,2)(4,3)(4,4)(4,5)(5,1)(5,2)(5,3)(5,4)(5,5) + + + o + (0,1)(0,2)(0,3)(0,4)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(2,0)(2,5)(3,0)(3,5)(4,0)(4,1)(4,2)(4,3)(4,4)(4,5)(5,1)(5,2)(5,3)(5,4) + + + p + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(2,0)(2,5)(3,0)(3,5)(4,0)(4,1)(4,2)(4,3)(4,4)(4,5)(5,1)(5,2)(5,3)(5,4) + + + q + (0,1)(0,2)(0,3)(0,4)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(2,0)(2,5)(3,0)(3,5)(4,0)(4,1)(4,2)(4,3)(4,4)(4,5)(4,6)(4,7)(5,0)(5,1)(5,2)(5,3)(5,4)(5,5)(5,6)(5,7) + + + r + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(2,1)(3,0)(3,1)(4,0)(4,1) + + + s + (0,1)(0,2)(0,5)(1,0)(1,1)(1,2)(1,3)(1,5)(2,0)(2,2)(2,3)(2,5)(3,0)(3,2)(3,3)(3,4)(3,5)(4,0)(4,3)(4,4) + + + t + (0,2)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(2,0)(2,1)(2,2)(2,3)(2,4)(2,5)(2,6)(2,7)(3,2)(3,7)(4,2)(4,7) + + + u + (0,0)(0,1)(0,2)(0,3)(0,4)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(2,5)(3,5)(4,0)(4,1)(4,2)(4,3)(4,4)(4,5)(5,0)(5,1)(5,2)(5,3)(5,4)(5,5) + + + v + (0,0)(0,1)(0,2)(1,0)(1,1)(1,2)(1,3)(1,4)(2,3)(2,4)(2,5)(3,3)(3,4)(3,5)(4,0)(4,1)(4,2)(4,3)(4,4)(5,0)(5,1)(5,2) + + + w + (0,0)(0,1)(0,2)(0,3)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(2,4)(2,5)(3,0)(3,1)(3,2)(3,3)(4,0)(4,1)(4,2)(4,3)(5,4)(5,5)(6,0)(6,1)(6,2)(6,3)(6,4)(6,5)(7,0)(7,1)(7,2)(7,3) + + + x + (0,0)(0,1)(0,4)(0,5)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(2,2)(2,3)(3,2)(3,3)(4,0)(4,1)(4,2)(4,3)(4,4)(4,5)(5,0)(5,1)(5,4)(5,5) + + + y + (0,0)(0,1)(1,0)(1,1)(1,2)(1,3)(1,6)(1,7)(2,2)(2,3)(2,4)(2,5)(2,6)(2,7)(3,2)(3,3)(3,4)(3,5)(4,0)(4,1)(4,2)(4,3)(5,0)(5,1) + + + z + (0,0)(0,4)(0,5)(1,0)(1,3)(1,4)(1,5)(2,0)(2,2)(2,3)(2,5)(3,0)(3,1)(3,2)(3,5)(4,0)(4,1)(4,5) + + + + + + + . + (0,0)(0,1) + + + ~ + (0,1)(0,2)(1,0)(2,0)(3,1)(4,2)(5,2)(6,0)(6,1) + + + @ + (0,2)(0,3)(0,4)(0,5)(0,6)(1,1)(1,7)(2,0)(2,3)(2,4)(2,5)(2,8)(3,0)(3,2)(3,6)(3,8)(4,0)(4,2)(4,6)(4,8)(5,0)(5,2)(5,3)(5,4)(5,5)(5,8)(6,0)(6,6)(7,1)(7,2)(7,3)(7,4)(7,5) + + + # + (0,5)(1,2)(1,5)(1,6)(1,7)(2,2)(2,3)(2,4)(2,5)(3,0)(3,1)(3,2)(3,5)(3,6)(3,7)(4,2)(4,3)(4,4)(4,5)(5,0)(5,1)(5,2)(5,5)(6,2) + + + $ + (0,3)(0,4)(0,8)(1,2)(1,5)(1,8)(2,0)(2,1)(2,2)(2,3)(2,4)(2,5)(2,6)(2,7)(2,8)(2,9)(2,10)(3,2)(3,5)(3,8)(4,2)(4,6)(4,7) + + + ^ + (0,3)(1,2)(2,1)(3,0)(4,1)(5,2)(6,3) + + + * + (0,1)(0,3)(1,2)(2,0)(2,1)(2,2)(2,3)(2,4)(3,2)(4,1)(4,3) + + + ( + (0,3)(0,4)(0,5)(0,6)(0,7)(1,1)(1,2)(1,8)(1,9)(2,0)(2,10) + + + ) + (0,0)(0,10)(1,1)(1,2)(1,8)(1,9)(2,3)(2,4)(2,5)(2,6)(2,7) + + + _ + (0,0)(1,0)(2,0)(3,0)(4,0)(5,0)(6,0) + + + - + (0,0)(1,0)(2,0) + + + + + (0,3)(1,3)(2,3)(3,0)(3,1)(3,2)(3,3)(3,4)(3,5)(3,6)(4,3)(5,3)(6,3) + + + { + (0,5)(1,5)(2,1)(2,2)(2,3)(2,4)(2,6)(2,7)(2,8)(2,9)(3,0)(3,10)(4,0)(4,10) + + + } + (0,0)(0,10)(1,0)(1,10)(2,1)(2,2)(2,3)(2,4)(2,6)(2,7)(2,8)(2,9)(3,5)(4,5) + + + [ + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(0,8)(0,9)(0,10)(1,0)(1,10)(2,0)(2,10) + + + ] + (0,0)(0,10)(1,0)(1,10)(2,0)(2,1)(2,2)(2,3)(2,4)(2,5)(2,6)(2,7)(2,8)(2,9)(2,10) + + + > + (0,0)(0,4)(1,0)(1,4)(2,1)(2,3)(3,1)(3,3)(4,2)(5,2) + + + < + (0,2)(1,2)(2,1)(2,3)(3,1)(3,3)(4,0)(4,4)(5,0)(5,4) + + + / + (0,8)(0,9)(1,6)(1,7)(2,4)(2,5)(3,2)(3,3)(4,0)(4,1) + + + | + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(0,8)(0,9) + + + \ + (0,0)(0,1)(1,2)(1,3)(2,4)(2,5)(3,6)(3,7)(4,8)(4,9) + + + п + (0,4)(1,4)(2,4)(2,3)(2,2)(2,1)(2,0)(3,0)(4,0)(5,0)(6,0)(6,1)(6,2)(6,3)(6,4)(7,4)(8,4) + + + п + (0,2)(1,2)(2,2)(2,1)(2,0)(3,0)(4,0)(5,0)(6,0)(6,1)(6,2)(7,2)(8,2) + + + п + (0,4)(1,4)(2,4)(3,4)(4,0)(4,1)(4,2)(4,3)(4,4)(5,0)(6,0)(7,0)(8,0)(8,1)(8,2)(8,3)(8,4)(9,4)(10,4)(11,4)(12,4)(13,4)(14,4)(15,4)(16,4) + + + п + (0,2)(1,2)(2,2)(3,2)(4,0)(4,1)(4,2)(5,0)(6,0)(7,0)(8,0)(8,1)(8,2)(9,2)(10,2)(11,2)(12,2)(13,2)(14,2)(15,2)(16,2) + + + п + (0,3)(1,3)(2,3)(3,3)(4,0)(4,1)(4,2)(4,3)(5,0)(6,0)(7,0)(8,0)(8,1)(8,2)(8,3)(9,3)(10,3)(11,3)(12,3)(13,3)(14,3)(15,3)(16,3) + + + п + (0,1)(1,1)(2,1)(3,1)(4,0)(4,1)(5,0)(6,0)(7,0)(8,0)(8,1)(9,1)(10,1)(11,1)(12,1)(13,1)(14,1)(15,1)(16,1) + + + + + (0,4)(0,3)(1,4)(1,3)(2,4)(2,3)(3,3)(3,4)(4,7)(4,0)(4,6)(4,5)(4,4)(4,2)(4,3)(4,1)(5,2)(5,5)(5,6)(5,1)(5,4)(5,3)(6,5)(6,4)(6,2)(6,3)(7,3)(7,4) + + + + + (0,4)(0,3)(1,4)(1,3)(2,4)(2,3)(3,3)(3,4)(4,7)(4,0)(4,6)(4,5)(4,4)(4,2)(4,3)(4,1)(5,2)(5,5)(5,6)(5,1)(5,4)(5,3)(6,5)(6,4)(6,2)(6,3)(7,3)(7,4) + + + + + + . + (0,0)(1,0)(0,1)(1,1) + + + ~ + (0,1)(0,2)(0,3)(1,0)(2,0)(3,1)(3,2)(4,3)(5,3)(6,0)(6,1)(6,2) + + + @ + (0,2)(0,3)(0,4)(0,5)(0,6)(1,1)(1,7)(2,0)(2,3)(2,4)(2,5)(2,8)(3,0)(3,2)(3,3)(3,4)(3,5)(3,6)(3,8)(4,0)(4,2)(4,6)(4,8)(5,0)(5,2)(5,3)(5,4)(5,5)(5,6)(5,8)(6,0)(6,2)(6,3)(6,4)(6,5)(6,6)(6,8)(7,0)(7,6)(8,1)(8,2)(8,3)(8,4)(8,5) + + + # + (0,5)(1,2)(1,5)(1,6)(1,7)(2,2)(2,3)(2,4)(2,5)(3,0)(3,1)(3,2)(3,5)(3,6)(3,7)(4,2)(4,3)(4,4)(4,5)(5,0)(5,1)(5,2)(5,5)(6,2) + + + $ + (0,3)(0,4)(0,7)(1,2)(1,3)(1,4)(1,5)(1,8)(2,2)(2,5)(2,6)(2,7)(2,8)(2,9)(2,10)(3,0)(3,1)(3,2)(3,3)(3,4)(3,5)(3,8)(4,2)(4,5)(4,6)(4,7)(4,8)(5,3)(5,6)(5,7) + + + ^ + (0,3)(1,2)(1,3)(2,1)(2,2)(3,0)(3,1)(4,0)(4,1)(5,1)(5,2)(6,2)(6,3)(7,3) + + + * + (0,1)(0,3)(1,2)(2,0)(2,1)(2,2)(2,3)(2,4)(3,2)(4,1)(4,3) + + + ( + (0,3)(0,4)(0,5)(0,6)(0,7)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(1,8)(1,9)(2,0)(2,1)(2,2)(2,8)(2,9)(2,10)(3,0)(3,10) + + + ) + (0,0)(0,10)(1,0)(1,1)(1,2)(1,8)(1,9)(1,10)(2,1)(2,2)(2,3)(2,4)(2,5)(2,6)(2,7)(2,8)(2,9)(3,3)(3,4)(3,5)(3,6)(3,7) + + + _ + (0,0)(1,0)(2,0)(3,0)(4,0)(5,0)(6,0)(7,0) + + + - + (0,0)(1,0)(2,0)(3,0) + + + + + (0,3)(1,3)(2,3)(3,0)(3,1)(3,2)(3,3)(3,4)(3,5)(3,6)(4,3)(5,3)(6,3) + + + { + (0,5)(1,5)(2,1)(2,2)(2,3)(2,4)(2,5)(2,6)(2,7)(2,8)(2,9)(3,0)(3,1)(3,2)(3,3)(3,4)(3,6)(3,7)(3,8)(3,9)(3,10)(4,0)(4,10)(5,0)(5,10) + + + } + (0,0)(0,10)(1,0)(1,10)(2,0)(2,1)(2,2)(2,3)(2,4)(2,6)(2,7)(2,8)(2,9)(2,10)(3,1)(3,2)(3,3)(3,4)(3,5)(3,6)(3,7)(3,8)(3,9)(4,5)(5,5) + + + [ + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(0,8)(0,9)(0,10)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(1,8)(1,9)(1,10)(2,0)(2,10)(3,0)(3,10) + + + ] + (0,0)(0,10)(1,0)(1,10)(2,0)(2,1)(2,2)(2,3)(2,4)(2,5)(2,6)(2,7)(2,8)(2,9)(2,10)(3,0)(3,1)(3,2)(3,3)(3,4)(3,5)(3,6)(3,7)(3,8)(3,9)(3,10) + + + < + (0,3)(1,2)(1,4)(2,2)(2,4)(3,1)(3,5)(4,1)(4,5)(5,0)(5,6)(6,0)(6,6) + + + > + (0,0)(0,6)(1,0)(1,6)(2,1)(2,5)(3,1)(3,5)(4,2)(4,4)(5,2)(5,4)(6,3) + + + / + (0,9)(0,10)(1,7)(1,8)(1,9)(1,10)(2,4)(2,5)(2,6)(2,7)(2,8)(3,2)(3,3)(3,4)(3,5)(3,6)(4,0)(4,1)(4,2)(4,3)(5,0)(5,1) + + + | + (0,0)(0,1)(0,2)(0,3)(0,4)(0,5)(0,6)(0,7)(0,8)(0,9)(0,10)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(1,8)(1,9)(1,10) + + + \ + (0,0)(0,1)(1,0)(1,1)(1,2)(1,3)(2,2)(2,3)(2,4)(2,5)(2,6)(3,4)(3,5)(3,6)(3,7)(3,8)(4,7)(4,8)(4,9)(4,10)(5,9)(5,10) + + + + + + + 0 + (0,2)(0,4)(0,5)(0,6)(0,3)(0,1)(1,7)(1,0)(2,7)(2,0)(3,7)(3,0)(4,1)(4,4)(4,2)(4,5)(4,3)(4,6) + + + 1 + (0,7)(0,1)(1,1)(1,7)(2,5)(2,6)(2,7)(2,0)(2,1)(2,2)(2,4)(2,3)(3,7)(4,7) + + + 2 + (0,6)(0,1)(0,7)(1,5)(1,0)(1,7)(2,7)(2,0)(2,4)(3,0)(3,7)(3,3)(4,7)(4,1)(4,2) + + + 3 + (0,1)(0,6)(1,7)(1,0)(2,3)(2,7)(2,0)(3,3)(3,7)(3,0)(4,1)(4,2)(4,5)(4,4)(4,6) + + + 4 + (0,5)(0,4)(1,5)(1,3)(2,5)(2,2)(3,1)(3,5)(4,7)(4,6)(4,1)(4,3)(4,2)(4,4)(4,5)(4,0)(5,5) + + + 5 + (0,0)(0,2)(0,1)(0,3)(0,6)(1,3)(1,7)(1,0)(2,7)(2,0)(2,3)(3,7)(3,0)(3,3)(4,4)(4,0)(4,6)(4,5) + + + 6 + (0,2)(0,3)(0,4)(0,5)(0,6)(1,3)(1,1)(1,7)(2,0)(2,3)(2,7)(3,7)(3,3)(3,0)(4,4)(4,5)(4,6) + + + 7 + (0,0)(1,7)(1,0)(1,6)(2,4)(2,5)(2,0)(3,3)(3,0)(3,2)(4,1)(4,0) + + + 8 + (0,1)(0,2)(0,4)(0,6)(0,5)(1,7)(1,0)(1,3)(2,7)(2,0)(2,3)(3,3)(3,0)(3,7)(4,2)(4,4)(4,1)(4,6)(4,5) + + + 9 + (0,3)(0,1)(0,2)(1,7)(1,0)(1,4)(2,0)(2,7)(2,4)(3,6)(3,4)(3,0)(4,1)(4,3)(4,2)(4,4)(4,5) + + + + + 0 + (0,1)(0,5)(0,2)(0,4)(0,6)(0,3)(1,7)(1,3)(1,4)(1,5)(1,1)(1,6)(1,2)(1,0)(2,7)(2,0)(3,0)(3,7)(4,0)(4,2)(4,7)(4,6)(4,4)(4,3)(4,1)(4,5)(5,4)(5,3)(5,2)(5,5)(5,1)(5,6) + + + 1 + (0,7)(0,1)(1,4)(1,3)(1,5)(1,6)(1,7)(1,1)(1,0)(1,2)(2,1)(2,7)(2,5)(2,0)(2,4)(2,2)(2,3)(2,6)(3,7) + + + 2 + (0,6)(0,7)(0,1)(1,5)(1,1)(1,0)(1,6)(1,7)(2,7)(2,4)(2,5)(2,0)(3,7)(3,0)(3,3)(3,4)(4,7)(4,3)(4,2)(4,1)(4,0)(5,2)(5,7)(5,1) + + + 3 + (0,1)(0,6)(1,6)(1,1)(1,7)(1,0)(2,7)(2,3)(2,0)(3,3)(3,0)(3,7)(4,0)(4,2)(4,6)(4,7)(4,1)(4,4)(4,3)(4,5)(5,1)(5,2)(5,6)(5,5)(5,4) + + + 4 + (0,4)(0,5)(1,3)(1,5)(2,2)(2,5)(3,6)(3,7)(3,5)(3,1)(3,4)(3,3)(3,2)(4,1)(4,0)(4,7)(4,6)(4,3)(4,4)(4,5)(4,2)(5,5) + + + 5 + (0,6)(1,3)(1,1)(1,2)(1,6)(1,7)(1,0)(2,7)(2,0)(2,3)(2,2)(2,1)(3,7)(3,3)(3,0)(4,6)(4,7)(4,4)(4,3)(4,5)(4,0)(5,5)(5,4)(5,6)(5,0) + + + 6 + (0,5)(0,2)(0,6)(0,3)(0,4)(1,3)(1,5)(1,4)(1,1)(1,7)(1,2)(1,6)(2,7)(2,0)(2,1)(2,3)(3,3)(3,0)(3,7)(4,7)(4,0)(4,4)(4,5)(4,3)(4,6)(5,5)(5,4)(5,6) + + + 7 + (0,0)(1,0)(1,6)(1,7)(2,0)(2,4)(2,5)(2,6)(2,7)(3,0)(3,2)(3,3)(3,4)(3,5)(4,0)(4,1)(4,2)(4,3)(5,0)(5,1) + + + 8 + (0,1)(0,2)(0,4)(0,5)(0,6)(1,0)(1,1)(1,2)(1,3)(1,4)(1,5)(1,6)(1,7)(2,0)(2,3)(2,7)(3,0)(3,3)(3,7)(4,0)(4,1)(4,2)(4,3)(4,4)(4,5)(4,6)(4,7)(5,1)(5,2)(5,4)(5,5)(5,6) + + + 9 + (0,1)(0,2)(0,3)(1,2)(1,3)(1,4)(1,0)(1,7)(1,1)(2,7)(2,0)(2,4)(3,6)(3,7)(3,4)(3,0)(4,1)(4,0)(4,6)(4,5)(4,4)(4,3)(4,2)(5,3)(5,1)(5,4)(5,2)(5,5) + + + + \ No newline at end of file diff --git a/OpticalCharacterRecognition/Program.cs b/OpticalCharacterRecognition/Program.cs new file mode 100644 index 0000000..dab703b --- /dev/null +++ b/OpticalCharacterRecognition/Program.cs @@ -0,0 +1,19 @@ +using System; +using System.Windows.Forms; + +namespace OpticalCharacterRecognition +{ + static class Program + { + /// + /// Point d'entrée principal de l'application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new FormMain()); + } + } +} diff --git a/OpticalCharacterRecognition/Properties/AssemblyInfo.cs b/OpticalCharacterRecognition/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..d4fe940 --- /dev/null +++ b/OpticalCharacterRecognition/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// Les informations générales relatives à un assembly dépendent de +// l'ensemble d'attributs suivant. Changez les valeurs de ces attributs pour modifier les informations +// associées à un assembly. +[assembly: AssemblyTitle("OpticalCharacterRecognition")] +[assembly: AssemblyDescription("Simple application")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Freddy Juhel")] +[assembly: AssemblyProduct("OpticalCharacterRecognition")] +[assembly: AssemblyCopyright("Copyright © Freddy Juhel MIT 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// L'affectation de la valeur false à ComVisible rend les types invisibles dans cet assembly +// aux composants COM. Si vous devez accéder à un type dans cet assembly à partir de +// COM, affectez la valeur true à l'attribut ComVisible sur ce type. +[assembly: ComVisible(false)] + +// Le GUID suivant est pour l'ID de la typelib si ce projet est exposé à COM +[assembly: Guid("b492fe99-f506-48c7-8d6d-b35c2cdef668")] + +// Les informations de version pour un assembly se composent des quatre valeurs suivantes : +// +// Version principale +// Version secondaire +// Numéro de build +// Révision +// +// Vous pouvez spécifier toutes les valeurs ou indiquer les numéros de build et de révision par défaut +// en utilisant '*', comme indiqué ci-dessous : +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/OpticalCharacterRecognition/Properties/Resources.Designer.cs b/OpticalCharacterRecognition/Properties/Resources.Designer.cs new file mode 100644 index 0000000..ea6ebb2 --- /dev/null +++ b/OpticalCharacterRecognition/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// Ce code a été généré par un outil. +// Version du runtime :4.0.30319.42000 +// +// Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si +// le code est régénéré. +// +//------------------------------------------------------------------------------ + +namespace OpticalCharacterRecognition.Properties { + using System; + + + /// + /// Une classe de ressource fortement typée destinée, entre autres, à la consultation des chaînes localisées. + /// + // Cette classe a été générée automatiquement par la classe StronglyTypedResourceBuilder + // à l'aide d'un outil, tel que ResGen ou Visual Studio. + // Pour ajouter ou supprimer un membre, modifiez votre fichier .ResX, puis réexécutez ResGen + // avec l'option /str ou régénérez votre projet VS. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Retourne l'instance ResourceManager mise en cache utilisée par cette classe. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("OpticalCharacterRecognition.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Remplace la propriété CurrentUICulture du thread actuel pour toutes + /// les recherches de ressources à l'aide de cette classe de ressource fortement typée. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/OpticalCharacterRecognition/Properties/Resources.resx b/OpticalCharacterRecognition/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/OpticalCharacterRecognition/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/OpticalCharacterRecognition/Properties/Settings.Designer.cs b/OpticalCharacterRecognition/Properties/Settings.Designer.cs new file mode 100644 index 0000000..b30c5b7 --- /dev/null +++ b/OpticalCharacterRecognition/Properties/Settings.Designer.cs @@ -0,0 +1,110 @@ +//------------------------------------------------------------------------------ +// +// Ce code a été généré par un outil. +// Version du runtime :4.0.30319.42000 +// +// Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si +// le code est régénéré. +// +//------------------------------------------------------------------------------ + +namespace OpticalCharacterRecognition.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("600")] + public int WindowHeight { + get { + return ((int)(this["WindowHeight"])); + } + set { + this["WindowHeight"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("800")] + public int WindowWidth { + get { + return ((int)(this["WindowWidth"])); + } + set { + this["WindowWidth"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("0")] + public int WindowTop { + get { + return ((int)(this["WindowTop"])); + } + set { + this["WindowTop"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("0")] + public int WindowLeft { + get { + return ((int)(this["WindowLeft"])); + } + set { + this["WindowLeft"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("English")] + public string LastLanguageUsed { + get { + return ((string)(this["LastLanguageUsed"])); + } + set { + this["LastLanguageUsed"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Translations.xml")] + public string LanguageFileName { + get { + return ((string)(this["LanguageFileName"])); + } + set { + this["LanguageFileName"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Large")] + public string DisplayToolStripMenuItem { + get { + return ((string)(this["DisplayToolStripMenuItem"])); + } + set { + this["DisplayToolStripMenuItem"] = value; + } + } + } +} diff --git a/OpticalCharacterRecognition/Properties/Settings.settings b/OpticalCharacterRecognition/Properties/Settings.settings new file mode 100644 index 0000000..934840c --- /dev/null +++ b/OpticalCharacterRecognition/Properties/Settings.settings @@ -0,0 +1,27 @@ + + + + + + 600 + + + 800 + + + 0 + + + 0 + + + English + + + Translations.xml + + + Large + + + \ No newline at end of file diff --git a/OpticalCharacterRecognition/Punctuation.cs b/OpticalCharacterRecognition/Punctuation.cs new file mode 100644 index 0000000..a60aee2 --- /dev/null +++ b/OpticalCharacterRecognition/Punctuation.cs @@ -0,0 +1,74 @@ +/* +The MIT License(MIT) +Copyright(c) 2015 Freddy Juhel +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +using System; + +namespace OpticalCharacterRecognition +{ + public static class Punctuation + { + public const string Comma = ","; + public const string Colon = ":"; + public const string OneSpace = " "; + public const string Dash = "-"; + public const string UnderScore = "_"; + public const string SignAt = "@"; + public const string Ampersand = "&"; + public const string SignSharp = "#"; + public const string Period = "."; + public const string Backslash = "\\"; + public const string Slash = "/"; + public const string OpenParenthesis = "("; + public const string CloseParenthesis = ")"; + public const string OpenCurlyBrace = "{"; + public const string CloseCurlyBrace = "}"; + public const string OpenSquareBracket = "["; + public const string CloseSquareBracket = "]"; + public const string LessThan = "<"; + public const string GreaterThan = ">"; + public const string DoubleQuote = "\""; + public const string SimpleQuote = "'"; + public const string Tilde = "~"; + public const string Pipe = "|"; + public const string Plus = "+"; + public const string Minus = "-"; + public const string Multiply = "*"; + public const string Divide = "/"; + public const string Dollar = "$"; + public const string Pound = "£"; + public const string Percent = "%"; + public const string QuestionMark = "?"; + public const string ExclamationPoint = "!"; + public const string Chapter = "§"; + public const string Micro = "µ"; + public static string CrLf = Environment.NewLine; + + public static string Tabulate(ushort numberOfTabulation = 1) + { + string result = string.Empty; + for (int number = 0; number < numberOfTabulation; number++) + { + result += " "; + } + + return result; + } + } +} \ No newline at end of file diff --git a/OpticalCharacterRecognition/Translations.xml b/OpticalCharacterRecognition/Translations.xml new file mode 100644 index 0000000..0f31684 --- /dev/null +++ b/OpticalCharacterRecognition/Translations.xml @@ -0,0 +1,243 @@ + + + + 1.0 + + + + MenuFile + File + Fichier + + + MenuFileNew + New + Nouveau + + + MenuFileOpen + Open + Ouvrir + + + MenuFileSave + Save + Enregistrer + + + MenuFileSaveAs + Save as ... + Enregistrer sous ... + + + MenuFilePrint + Print ... + Imprimer ... + + + MenufilePageSetup + Page setup + Aperçu avant impression + + + MenufileQuit + Quit + Quitter + + + MenuEdit + Edit + Edition + + + MenuEditCancel + Cancel + Annuler + + + MenuEditRedo + Redo + Rétablir + + + MenuEditCut + Cut + Couper + + + MenuEditCopy + Copy + Copier + + + MenuEditPaste + Paste + Coller + + + MenuEditSelectAll + Select All + Sélectionner tout + + + MenuTools + Tools + Outils + + + MenuToolsCustomize + Customize ... + Personaliser ... + + + MenuToolsOptions + Options + Options + + + MenuLanguage + Language + Langage + + + MenuLanguageEnglish + English + Anglais + + + MenuLanguageFrench + French + Français + + + MenuHelp + Help + Aide + + + MenuHelpSummary + Summary + Sommaire + + + MenuHelpIndex + Index + Index + + + MenuHelpSearch + Search + Rechercher + + + MenuHelpAbout + About + A propos de ... + + + ThereIs + There is + Il y a + + + toCut + to cut + à couper + + + NoTextHasBeenSelected + No text has been selected + Pas de texte a été selectionné + + + ThereIsNothingToCopy + There is nothing to copy + Il n'y a rien à copier + + + Display + Display + Affichage + + + Small + Small + Petit + + + Medium + Medium + Moyen + + + Large + Large + Grand + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OpticalCharacterRecognition/images/github art.jpg b/OpticalCharacterRecognition/images/github art.jpg new file mode 100644 index 0000000..4efdeb4 Binary files /dev/null and b/OpticalCharacterRecognition/images/github art.jpg differ diff --git a/OpticalCharacterRecognition/images/github_art.bmp b/OpticalCharacterRecognition/images/github_art.bmp new file mode 100644 index 0000000..e74a821 Binary files /dev/null and b/OpticalCharacterRecognition/images/github_art.bmp differ diff --git a/OpticalCharacterRecognition/images/paperboy.jpg b/OpticalCharacterRecognition/images/paperboy.jpg new file mode 100644 index 0000000..8dc4406 Binary files /dev/null and b/OpticalCharacterRecognition/images/paperboy.jpg differ diff --git a/OpticalCharacterRecognition/images/sample1.png b/OpticalCharacterRecognition/images/sample1.png new file mode 100644 index 0000000..64e827f Binary files /dev/null and b/OpticalCharacterRecognition/images/sample1.png differ diff --git a/OpticalCharacterRecognition/images/sampleColor.PNG b/OpticalCharacterRecognition/images/sampleColor.PNG new file mode 100644 index 0000000..037ff4f Binary files /dev/null and b/OpticalCharacterRecognition/images/sampleColor.PNG differ diff --git a/OpticalCharacterRecognition/images/sampleTest.PNG b/OpticalCharacterRecognition/images/sampleTest.PNG new file mode 100644 index 0000000..64e827f Binary files /dev/null and b/OpticalCharacterRecognition/images/sampleTest.PNG differ diff --git a/OpticalCharacterRecognition/sampleColor.PNG b/OpticalCharacterRecognition/sampleColor.PNG new file mode 100644 index 0000000..037ff4f Binary files /dev/null and b/OpticalCharacterRecognition/sampleColor.PNG differ diff --git a/OpticalCharacterRecognition/sampleTest.PNG b/OpticalCharacterRecognition/sampleTest.PNG new file mode 100644 index 0000000..64e827f Binary files /dev/null and b/OpticalCharacterRecognition/sampleTest.PNG differ