/**
         * 滴水法入口
         * @param sourceImage
         * @return 切割完图片的数组
         */
        public IList <Bitmap> Execute(Bitmap sourceImage)
        {
            var imageList = new List <Bitmap>();

            this.sourceImage = sourceImage;

            int width  = sourceImage.Width;
            int height = sourceImage.Height;

            Console.WriteLine("width:" + width + " height:" + height);

            //		if (width <= maxD) {
            //			//如果是单个字符,则直接返回
            //			this.imageList.add(sourceImage);
            //			return this.imageList;
            //		}

            //在x轴的投影
            int[] histData = new int[width];
            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)
                {
                    var color = sourceImage.GetPixel(x, y);

                    if (ColorHelper.isBlack(color))
                    {
                        histData[x]++;
                    }
                }
            }

            List <int> extrems = Extremum.GetMinExtrem(histData);

            Point[] startRoute = new Point[height];
            Point[] endRoute   = null;

            for (int y = 0; y < height; y++)
            {
                startRoute[y] = new Point(0, y);
            }

            int num      = (int)Math.Round((double)(width * 1.0 / meanD * 1.0)); //字符的个数
            int lastP    = 0;                                                    //上一次分割的位置
            int curSplit = 1;                                                    //分割点的个数,小于等于 num - 1;

            for (int i = 0; i < extrems.Count; i++)
            {
                if (curSplit > (num - 1))
                {
                    break;
                }

                //判断两个分割点之间的距离是否合法
                int curP     = extrems[(i)];
                int dBetween = curP - lastP + 1;
                if (dBetween < minD || dBetween > maxD)
                {
                    continue;
                }

                //			//判断当前分割点与末尾结束点的位置是否合法
                //			int dAll = width - curP + 1;
                //			if (dAll < minD*(num - curSplit) || dAll > maxD*(num - curSplit)) {
                //				continue;
                //			}
                endRoute = getEndRoute(new Point(curP, 0), height, curSplit);
                doSplit(imageList, startRoute, endRoute);
                startRoute = endRoute;
                lastP      = curP;
                curSplit++;
                Console.WriteLine(curP);
            }

            endRoute = new Point[height];
            for (int y = 0; y < height; y++)
            {
                endRoute[y] = new Point(width - 1, y);
            }
            doSplit(imageList, startRoute, endRoute);

            Console.WriteLine("=================");
            Console.WriteLine(width + "," + height);

            return(imageList);
        }