Example #1
0
        public static double CompareShapePercentage(ProbabilisticImage A, ProbabilisticImage B)
        {
            double PointCount = Utility.Utility.GetGreatest(A.SampleCount, B.SampleCount);
            double Amount = 0.0, IncreaseAmount = 1.0 / PointCount;

            for (int i = 0; i < PointCount; i++)
            {
                double RelativeX = Utility.Utility.Generator.NextDouble() * 2.0 - 1.0;
                double RelativeY = Utility.Utility.Generator.NextDouble() * 2.0 - 1.0;

                Point ACompare = new Point();
                Point BCompare = new Point();

                if (A.IsCircle && B.IsCircle)
                {
                    ACompare = A.GetCircularPoint(RelativeX, RelativeY);
                    BCompare = B.GetCircularPoint(RelativeX, RelativeY);
                }
                else
                {
                    ACompare = A.GetRectangularPoint(RelativeX, RelativeY);
                    BCompare = B.GetRectangularPoint(RelativeX, RelativeY);
                }

                //If neither is a background color, then it must be part of the main picture, and therefore the shape is the same here.
                if ((!ImageUtility.ColorCheck(A.BackgroundColor, A.GetPixel(ACompare))) == (!ImageUtility.ColorCheck(B.BackgroundColor, B.GetPixel(BCompare))))
                {
                    Amount += IncreaseAmount;
                }
            }

            return(Amount);
        }
Example #2
0
        public ImageClass(string Name, List <ProbabilisticImage> Samples, ProbabilisticImage Master)
        {
            this.Name = Name;

            this.Samples = Samples;

            this.Master = Master;
        }
Example #3
0
        public static double ComparePercentage(ProbabilisticImage FileOne, ProbabilisticImage FileTwo)
        {
            double ColorPercentage = CompareColorPercentage(FileOne, FileTwo, true);
            double ShapePercentage = CompareShapePercentage(FileOne, FileTwo);

            //Console.WriteLine("{0} percentage of color samples match.", ColorPercentage);
            //Console.WriteLine("{0} percentage of shape samples match.", ShapePercentage);

            return(ColorPercentage / 2 + ShapePercentage / 2);
        }
Example #4
0
        public static double CompareColorPercentage(ProbabilisticImage A, ProbabilisticImage B, bool RoughColorMatch)
        {
            double PointCount = Math.Pow(A.R, 2);
            double Amount = 0.0, IncreaseAmount = 1.0 / PointCount;

            for (int x = -A.R; x < A.R; x++)
            {
                for (int y = -A.R; y < A.R; y++)
                {
                    double RelativeX = (double)x / (double)A.R;
                    double RelativeY = (double)y / (double)A.R;

                    Point ACompare = new Point();
                    Point BCompare = new Point();

                    if (A.IsCircle && B.IsCircle)
                    {
                        ACompare = A.GetCircularPoint(RelativeX, RelativeY);
                        BCompare = B.GetCircularPoint(RelativeX, RelativeY);
                    }
                    else
                    {
                        ACompare = A.GetRectangularPoint(RelativeX, RelativeY);
                        BCompare = B.GetRectangularPoint(RelativeX, RelativeY);
                    }

                    Color APixel = A.GetPixel(ACompare);
                    Color BPixel = B.GetPixel(BCompare);

                    //Console.WriteLine("{0} == {1} = {2}", APixel.ToString(), B.GetPixel(BCompare).ToString(), ImageUtility.ColorCheck(APixel, B.GetPixel(BCompare)));

                    if (ImageUtility.ColorCheck(A.BackgroundColor, APixel) ^ ImageUtility.ColorCheck(B.BackgroundColor, BPixel))
                    {
                        continue;
                    }
                    else if (ImageUtility.ColorCheck(A.BackgroundColor, APixel) && ImageUtility.ColorCheck(B.BackgroundColor, BPixel))
                    {
                        Amount += IncreaseAmount;
                        continue;
                    }
                    else if (ImageUtility.ColorCheck(APixel, BPixel))
                    {
                        Amount += IncreaseAmount;
                    }
                }
            }

            return(Amount);
        }
Example #5
0
        public static ProbabilisticImage CreateMaster(List <ProbabilisticImage> Samples)
        {
            ProbabilisticImage A = Samples.First();

            Samples.RemoveAt(0);

            while (Samples.Count() > 0)
            {
                A = Combine(A, Samples.First());

                Samples.RemoveAt(0);
            }

            return(A);
        }
Example #6
0
        public static double CompareColorPercentage(ProbabilisticImage A, ProbabilisticImage B, bool RoughColorMatch)
        {
            double PointCount = Utility.Utility.GetGreatest(A.SampleCount, B.SampleCount);
            double Amount = 0.0, IncreaseAmount = 1.0 / PointCount;

            Console.WriteLine($"Sampling {PointCount} pixels.");

            for (int i = 0; i < PointCount; i++)
            {
                double RelativeX = Utility.Utility.Generator.NextDouble() * 2.0 - 1.0;
                double RelativeY = Utility.Utility.Generator.NextDouble() * 2.0 - 1.0;

                Point ACompare = new Point();
                Point BCompare = new Point();

                if (A.IsCircle && B.IsCircle)
                {
                    ACompare = A.GetCircularPoint(RelativeX, RelativeY);
                    BCompare = B.GetCircularPoint(RelativeX, RelativeY);
                }
                else
                {
                    ACompare = A.GetRectangularPoint(RelativeX, RelativeY);
                    BCompare = B.GetRectangularPoint(RelativeX, RelativeY);
                }

                Color APixel = A.GetPixel(ACompare);
                Color BPixel = B.GetPixel(BCompare);

                //Console.WriteLine("{0} == {1} = {2}", APixel.ToString(), B.GetPixel(BCompare).ToString(), ImageUtility.ColorCheck(APixel, B.GetPixel(BCompare)));

                if (ImageUtility.ColorCheck(A.BackgroundColor, APixel) ^ ImageUtility.ColorCheck(B.BackgroundColor, BPixel))
                {
                    continue;
                }
                else if (ImageUtility.ColorCheck(A.BackgroundColor, APixel) && ImageUtility.ColorCheck(B.BackgroundColor, BPixel))
                {
                    Amount += IncreaseAmount;
                    continue;
                }
                else if (ImageUtility.ColorCheck(APixel, BPixel))
                {
                    Amount += IncreaseAmount;
                }
            }

            return(Amount);
        }
Example #7
0
        public List <string> Classify(ProbabilisticImage Subject, bool UseProbabilisticCompare)
        {
            List <string> Results = new List <string>();

            foreach (ImageClass Check in Classes)
            {
                double Aggregate = 0.0;

                if (Check.TestClass(Subject, out Aggregate, UseProbabilisticCompare))
                {
                    Results.Add(Check.Name + ": " + Aggregate);
                }
            }

            return(Results);
        }
Example #8
0
        public static ProbabilisticImage Combine(ProbabilisticImage A, ProbabilisticImage B)
        {
            int SampleCount = Utility.Utility.GetGreatest(A.SampleCount, B.SampleCount);

            Bitmap Result = new Bitmap(A.Source.Width, A.Source.Height);

            for (int i = 0; i < SampleCount; i++)
            {
                double RelativeX = Utility.Utility.Generator.NextDouble() * 2.0 - 1.0;
                double RelativeY = Utility.Utility.Generator.NextDouble() * 2.0 - 1.0;

                Point ACompare = new Point();
                Point BCompare = new Point();

                if (A.IsCircle && B.IsCircle)
                {
                    ACompare = A.GetCircularPoint(RelativeX, RelativeY);
                    BCompare = B.GetCircularPoint(RelativeX, RelativeY);
                }
                else
                {
                    ACompare = A.GetRectangularPoint(RelativeX, RelativeY);
                    BCompare = B.GetRectangularPoint(RelativeX, RelativeY);
                }

                Color APixel = A.GetPixel(ACompare);
                Color BPixel = B.GetPixel(BCompare);

                if (ImageUtility.ColorCheck(A.BackgroundColor, APixel) ^ ImageUtility.ColorCheck(B.BackgroundColor, BPixel))
                {
                    continue;
                }
                else if (ImageUtility.ColorCheck(A.BackgroundColor, APixel) && ImageUtility.ColorCheck(B.BackgroundColor, BPixel))
                {
                    Result.SetPixel(ACompare.X, ACompare.Y, APixel);
                    continue;
                }
                else if (ImageUtility.ColorCheck(APixel, BPixel))
                {
                    Result.SetPixel(ACompare.X, ACompare.Y, APixel);
                }
            }

            return(new ProbabilisticImage(Result));
        }
Example #9
0
        public bool TestClass(ProbabilisticImage TestImage, out double Aggregate, bool UseProbabilisticCompare)
        {
            double Threshold = 0.0;

            Aggregate = 0.0;

            foreach (ProbabilisticImage TestSample in Samples)
            {
                double Percentage = (UseProbabilisticCompare) ? Probabilistic.ComparePercentage(TestSample, TestImage) : Normal.ComparePercentage(TestSample, TestImage);

                //Console.WriteLine(Percentage);

                if (Percentage > Aggregate)
                {
                    Aggregate = Percentage;
                }
            }

            return(Aggregate > Threshold);
        }
Example #10
0
        public static double CompareShapePercentage(ProbabilisticImage A, ProbabilisticImage B)
        {
            double PointCount = Math.Pow(A.R, 2);
            double Amount = 0.0, IncreaseAmount = 1.0 / PointCount;

            for (int x = -A.R; x < A.R; x++)
            {
                for (int y = -A.R; y < A.R; y++)
                {
                    double RelativeX = (double)x / (double)A.R;
                    double RelativeY = (double)y / (double)A.R;

                    Point ACompare = new Point();
                    Point BCompare = new Point();

                    if (A.IsCircle && B.IsCircle)
                    {
                        ACompare = A.GetCircularPoint(RelativeX, RelativeY);
                        BCompare = B.GetCircularPoint(RelativeX, RelativeY);
                    }
                    else
                    {
                        ACompare = A.GetRectangularPoint(RelativeX, RelativeY);
                        BCompare = B.GetRectangularPoint(RelativeX, RelativeY);
                    }

                    Color APixel = A.GetPixel(ACompare);
                    Color BPixel = B.GetPixel(BCompare);

                    //Console.WriteLine("{0} == {1} = {2}", APixel.ToString(), B.GetPixel(BCompare).ToString(), ImageUtility.ColorCheck(APixel, B.GetPixel(BCompare)));

                    //If neither is a background color, then it must be part of the main picture, and therefore the shape is the same here.
                    if ((!ImageUtility.ColorCheck(A.BackgroundColor, APixel)) == (!ImageUtility.ColorCheck(B.BackgroundColor, BPixel)))
                    {
                        Amount += IncreaseAmount;
                    }
                }
            }

            return(Amount);
        }
Example #11
0
        public static string ProcessCommand(string Input)
        {
            try
            {
                string Result = "";

                Store     Params = new Store(Store.SeperateByWord(Input));
                Stopwatch Ticks  = new Stopwatch();
                Ticks.Start();

                if (Params[0] == "compare")
                {
                    if (Params[1] == "percentage")
                    {
                        Result = ImageCompare.Compare.ComparePercentage(Params[2], Params[3]).ToString();
                    }
                }
                else if (Params[0] == "togglewriteresult")
                {
                    Program.WriteResult = !Program.WriteResult;
                }
                else if (Params[0] == "normalcompare")
                {
                    Result = Normal.ComparePercentage(Params[1], Params[2]).ToString();
                }
                else if (Params[0] == "probshape")
                {
                    Result = Probabilistic.CompareShapePercentage(Params[1], Params[2]).ToString();
                }
                else if (Params[0] == "probmaster")
                {
                    string[] Files = System.IO.Directory.GetFiles(Params[1], "*.png", System.IO.SearchOption.AllDirectories);

                    Console.WriteLine("Creating master from {0} files.", Files.Length);

                    List <ProbabilisticImage> Sources = new List <ProbabilisticImage>();

                    foreach (string File in Files)
                    {
                        Sources.Add(new ProbabilisticImage(new Bitmap(File)));
                    }

                    ProbabilisticImage Master = ProbabilisticImage.CreateMaster(Sources);
                    Master.Save(Params[2]);

                    Console.WriteLine("Finished.");
                }
                else if (Params[0] == "probcombine")
                {
                    string FileA      = Params[1];
                    string FileB      = Params[2];
                    string OutputFile = Params[3];

                    ProbabilisticImage.Combine(FileA, FileB).Save(OutputFile);
                }
                else if (Params[0] == "probimage")
                {
                    ProbabilisticImage CreatedImage = new ProbabilisticImage(new Bitmap(Params[1]));

                    Result = CreatedImage.ToString();
                }
                else if (Params[0] == "probcompare")
                {
                    Result = Probabilistic.ComparePercentage(Params[1], Params[2]).ToString();
                }
                else if (Params[0] == "create")
                {
                    if (Params[1] == "classifier")
                    {
                        Program.Classifier = new Classifier(Params[2]);
                    }
                    else if (Params[1] == "single_classifier")
                    {
                        Program.Classifier = new Classifier(Params[2], true);
                    }
                }
                else if (Params[0] == "probclassify")
                {
                    if (Params[1] == "directory")
                    {
                        string[] Files = System.IO.Directory.GetFiles(Params[2], "*.png", System.IO.SearchOption.AllDirectories);

                        Console.WriteLine("Checking {0} files.", Files.Length);

                        foreach (string File in Files)
                        {
                            var ClassifyResult = Program.Classifier.Classify(File, true);

                            string Classes = "";

                            if (ClassifyResult.Count() > 0)
                            {
                                var Temp = ClassifyResult
                                           .Select(N => N.Substring(N.IndexOf(":") + 2).Trim())
                                           .ToList();

                                var Weights = Temp
                                              .Select(N => Convert.ToDouble(N))
                                              .ToList();
                                var Names = ClassifyResult.Select(N => N.Substring(0, N.IndexOf(":"))).ToList();

                                Classes = File + ": " + String.Join(", ", ClassifyResult);

                                Console.WriteLine(Classes);
                                Console.WriteLine("Image is probably: " + Names[Weights.IndexOf(Weights.Max())] + ".\n");

                                Result += Classes + "\n" + "Image is probably: " + Names[Weights.IndexOf(Weights.Max())] + ".\n\n";
                            }
                            else
                            {
                                Console.WriteLine("No matches!");

                                Classes = File + ": " + "None";

                                Result += Classes + "\n";
                            }
                        }

                        Console.WriteLine("Finished.");
                    }
                    else
                    {
                        Result = String.Join(", ", Program.Classifier.Classify(Params[1], true));
                    }
                }
                else if (Params[0] == "classify")
                {
                    if (Params[1] == "directory")
                    {
                        string[] Files = System.IO.Directory.GetFiles(Params[2], "*.png", System.IO.SearchOption.AllDirectories);

                        Console.WriteLine("Checking {0} files.", Files.Length);

                        foreach (string File in Files)
                        {
                            var ClassifyResult = Program.Classifier.Classify(File, false);

                            string Classes = "";

                            if (ClassifyResult.Count() > 0)
                            {
                                var Temp = ClassifyResult
                                           .Select(N => N.Substring(N.IndexOf(":") + 2).Trim())
                                           .ToList();

                                var Weights = Temp
                                              .Select(N => Convert.ToDouble(N))
                                              .ToList();
                                var Names = ClassifyResult.Select(N => N.Substring(0, N.IndexOf(":"))).ToList();

                                Classes = File + ": " + String.Join(", ", ClassifyResult);

                                Console.WriteLine(Classes);
                                Console.WriteLine("Image is probably: " + Names[Weights.IndexOf(Weights.Max())] + ".\n");

                                Result += Classes + "\n" + "Image is probably: " + Names[Weights.IndexOf(Weights.Max())] + ".\n\n";
                            }
                            else
                            {
                                Console.WriteLine("No matches!");

                                Classes = File + ": " + "None";

                                Result += Classes + "\n";
                            }
                        }

                        Console.WriteLine("Finished.");
                    }
                    else
                    {
                        Result = String.Join(", ", Program.Classifier.Classify(Params[1], false));
                    }
                }
                else if (Params[0] == "probcontains")
                {
                    List <Point> Points = Probabilistic.Contains(Params[1], Params[2], Convert.ToDouble(Params[3]));
                    string       Stuff  = "";

                    foreach (Point Place in Points)
                    {
                        Stuff += Place.ToString() + "\n";
                    }

                    Console.WriteLine(Stuff);

                    Result = Points.Count().ToString();
                }
                else if (Params[0] == "clickon")
                {
                    if (Params.Count() > 2) // Specifying the click type
                    {
                        Result = Convert.ToInt32(ImageCompare.Output.ClickOn(Params[1], Convert.ToBoolean(Params[2]))).ToString();
                    }
                    else
                    {
                        Result = Convert.ToInt32(ImageCompare.Output.ClickOn(Params[1])).ToString();
                    }
                }
                else if (Params[0] == "clickpos")
                {
                    if (Params.Count() > 3)
                    {
                        if (Params[3].Equals("true"))
                        {
                            ImageCompare.MouseOutput.LeftClick(Convert.ToInt32(Params[1]), Convert.ToInt32(Params[2]));
                        }
                        else
                        {
                            ImageCompare.MouseOutput.RightClick(Convert.ToInt32(Params[1]), Convert.ToInt32(Params[2]));
                        }
                    }
                    else
                    {
                        ImageCompare.MouseOutput.LeftClick(Convert.ToInt32(Params[1]), Convert.ToInt32(Params[2]));
                    }
                }
                else if (Params[0] == "cursorpos")
                {
                    Result = Cursor.Position.X + ":" + Cursor.Position.Y;
                }
                else if (Params[0] == "clickarea")
                {
                    Console.WriteLine("Clicking {0}", Params[1]);

                    if (Params.Count() > 6)
                    {
                        Result = Convert.ToInt32(ImageCompare.Output.ClickArea(Params[1], Convert.ToInt32(Params[2]), Convert.ToInt32(Params[3]), Convert.ToInt32(Params[4]), Convert.ToInt32(Params[5]), Convert.ToBoolean(Params[6]))).ToString();
                    }
                    else
                    {
                        Result = Convert.ToInt32(ImageCompare.Output.ClickArea(Params[1], Convert.ToInt32(Params[2]), Convert.ToInt32(Params[3]), Convert.ToInt32(Params[4]), Convert.ToInt32(Params[5]))).ToString();
                    }
                }
                else if (Params[0] == "contains")
                {
                    if (Params[1] == "percentage")
                    {
                        Result = ImageCompare.Contain.Contains(Params[2], Params[3], Convert.ToDouble(Params[4])).Count().ToString();
                    }
                    else if (Params[1] == "directory")
                    {
                        List <Point> Points = ImageCompare.Contain.DirectoryContains(Params[3], System.IO.Directory.GetCurrentDirectory() + "\\" + Params[2]);

                        Result = Points.Count().ToString();
                    }
                    else if (Params[1] == "read")
                    {
                        Result = "";// ImageCompare.Contain.ReadImage(Params[3], Params[2], Convert.ToDouble(Params[4]));
                    }
                    else if (Params[1] == "max")
                    {
                        Result = ImageCompare.Contain.Contains(Params[2], Params[3], Convert.ToInt32(Params[4])).Count().ToString();
                    }
                    else
                    {
                        Result = ImageCompare.Contain.Contains(Params[1], Params[2]).Count().ToString();
                    }
                }
                else if (Params[0] == "edit")
                {
                    if (Params[1] == "closecrop")
                    {
                        if (Params[2] == "directory")
                        {
                            string   Directory = System.IO.Directory.GetCurrentDirectory() + "\\" + Params[3] + "\\";
                            string[] Files     = System.IO.Directory.GetFiles(Directory);

                            System.IO.Directory.CreateDirectory(Directory + "edited\\");

                            foreach (string File in Files)
                            {
                                ImageUtility.CloseCrop(Image.FromFile(File), Directory + "edited\\" + Utility.Utility.StripDirectoryName(File, Directory));
                            }
                        }
                        else
                        {
                            ImageUtility.CloseCrop(Image.FromFile(Params[2]), Params[3]);
                        }
                    }
                    else if (Params[1] == "scale")
                    {
                        if (Params.Information.Count > 5)
                        {
                            ImageUtility.Scale(new Bitmap(Image.FromFile(Params[2])), new Rectangle(0, 0, Convert.ToInt32(Params[3]), Convert.ToInt32(Params[4]))).Save(Params[5]);
                        }
                        else if (Params.Information.Count == 5)
                        {
                            ImageUtility.Scale(new Bitmap(Image.FromFile(Params[2])), Convert.ToDouble(Params[3])).Save(Params[4]);
                        }
                    }
                }
                else if (Params[0] == "dump")
                {
                    ImageCompare.Dump.DumpImage(Params[1]);
                }
                else if (Params[0] == "quit")
                {
                    return("quit");
                }
                else if (Params[0] == "template")
                {
                    if (Params[1] == "combine")
                    {
                        Template Base = new Template(Image.FromFile(Params[2]));
                        Template Mod  = new Template(Image.FromFile(Params[3]));

                        Template Combined = Template.Combine(Base, Mod);

                        Program.Created = Combined;
                    }
                    else if (Params[1] == "compare")
                    {
                        Template Base = new Template(Image.FromFile(Params[2]));
                        Template Mod  = new Template(Image.FromFile(Params[3]));

                        bool DoMatch = Template.Compare(Base, Mod);

                        Console.WriteLine("Templates {0} match.", (DoMatch) ? "do" : "do not");

                        Result = Convert.ToInt32(DoMatch).ToString();
                    }
                    else if (Params[1] == "check")
                    {
                        Template Base = new Template(Image.FromFile(Params[2]));
                        Template Mod  = new Template(Image.FromFile(Params[3]));

                        double Amount = Convert.ToDouble(Params[4]);

                        bool DoMatch = Template.Compare(Base, Mod, Amount);

                        Console.WriteLine("Templates {0} match.", (DoMatch) ? "do" : "do not");

                        Result = Convert.ToInt32(DoMatch).ToString();
                    }
                    else if (Params[1] == "matchamount")
                    {
                        Template Base = new Template(Image.FromFile(Params[2]));
                        Template Mod  = new Template(Image.FromFile(Params[3]));

                        double Amount = Template.MatchAmount(Base, Mod);

                        Console.WriteLine("Templates match {0}", Amount);

                        Result = Amount.ToString();
                    }
                    else if (Params[1] == "contains")
                    {
                        Template Container = new Template(Image.FromFile(Params[2]));
                        Template Search    = new Template(Image.FromFile(Params[3]));

                        List <Point> Points = OCR.Contains(Container, Search, Convert.ToDouble(Params[4]), 0);

                        Result = String.Join(", ", Points.Select(N => N.ToString()));
                    }
                    else if (Params[1] == "offload")
                    {
                        Program.Created.Offload(Params[2]);
                    }
                    else if (Params[1] == "dump")
                    {
                        Program.Created.Dump();
                    }
                    else if (Params[1] == "crop")
                    {
                        Program.Created = Program.Created.Crop(new RelativeRect((float)Convert.ToDouble(Params[2]), (float)Convert.ToDouble(Params[3]),
                                                                                (float)Convert.ToDouble(Params[4]), (float)Convert.ToDouble(Params[5])));
                    }
                    else if (Params.Information.Count > 2)
                    {
                        List <string> Files = new List <string>(Params.Information);

                        Files.RemoveAt(0);

                        foreach (string File in Files)
                        {
                            Program.Created = new Template(Image.FromFile(File));

                            Program.Created.Offload(Utility.Utility.StripExtension(File) + "_visual.png");
                        }
                    }
                    else
                    {
                        Program.Created = new Template(Image.FromFile(Params[1]));
                    }
                }
                else if (Params[0] == "help")
                {
                    Console.WriteLine("Standard Algorithms:");
                    Console.WriteLine("compare percentage file1 file2 - Returns the amount the two images match in percentages.");
                    Console.WriteLine("clickon file - Searches for the specified image on screen, and clicks on it.");
                    Console.WriteLine("dump file - Dumps the RGB of each pixels of the image to the screen.");
                    Console.WriteLine("contains");
                    Console.WriteLine("\tfile1 file2 - Returns a list of all the points at which a copy of file2 exists in file1.");
                    Console.WriteLine("\tall file1 file2 percentage max - Returns a list up to size max where file2 matched percentage amount in file1");
                    Console.WriteLine("\tdirectory directory file - Returns a list of points where any file in the directory exists in file1");
                    Console.WriteLine("\tmax file1 file2 amount - Returns up to amount results where file2 exists in file1.");
                    Console.WriteLine("\tpercentage file1 file2 amount - Returns a list of points that file2 matches by at least the amount (should be [0, 1]) in file1");
                    Console.WriteLine("\tread charlist file percentage - Attempts to read the file with the list of characters charlist (should be a directory)");
                    Console.WriteLine("\t\tthat match by at least percentage amount.");
                    Console.WriteLine("edit");
                    Console.WriteLine("\tclosecrop");
                    Console.WriteLine("\t\tfile savename - Crops the file as much possible without losing any background, then saves it as savename.");
                    Console.WriteLine("\t\tdirectory name - Crops all files in directory as much as possible, then puts them into a folder called edited inside the target directory.");
                    Console.WriteLine("\tscale file width height savename - Scales the file to be width and height then saves it as savename.");
                    Console.WriteLine("\tscale file percentage savename - Scales the file to be the specified percentage of its previous size.");
                    Console.WriteLine();
                    Console.WriteLine("Template-Based Algorithms:");
                    Console.WriteLine("template");
                    Console.WriteLine("\tcombine file1 file2 - Generates templates from file1 and file2, then combines them. The result is stored for later access.");
                    Console.WriteLine("\tcompare file1 file2 - Tells whether the two templates match completely, returning 1 if they do and 0 if not.");
                    Console.WriteLine("\tcheck file1 file2 percentage - Tells whether the two files match by at least percentage, returning 1 if they do and 0 if not.");
                    Console.WriteLine("\tcrop x y width height - Crops the current template to the specified size.");
                    Console.WriteLine("\tcontains file1 file2 - Returns all the positions in which file2 occurs in file1.");
                    Console.WriteLine("\tdump - Dumps the most recently created template to the screen.");
                    Console.WriteLine("\tmatchamount file1 file2 - Returns the amount that file1 and file2 match.");
                    Console.WriteLine("\toffload filename - Offloads the most recent template to filename.");
                    Console.WriteLine("\tfile - Generates a template from the file.");
                    Console.WriteLine();
                    Console.WriteLine("Probablistic:");
                    Console.WriteLine("probimage filename - Creates a probablistic image from the file specified.");
                    Console.WriteLine("probcompare file1 file2 - Compares the two images and returns the amount they match (percentage).");
                    Console.WriteLine("probcontains file1 file2 - Checks for all instances of file2 inside file1. Returns a list of points.");
                    Console.WriteLine();
                    Console.WriteLine("Other:");
                    Console.WriteLine("help - Shows this help menu.");
                    Console.WriteLine("quit - Exits the program.");
                    Console.WriteLine("togglewriteresult - Toggles displaying the result of commands.");
                }
                else
                {
                    Console.WriteLine("Unknown Command: {0}", Params[0]);
                }

                Ticks.Stop();

                TimeSpan Length = Ticks.Elapsed;

                return(Result);
            }
            catch (Exception E)
            {
                Console.WriteLine(E.ToString());
            }

            return("");
        }