/** * 滴水法入口 * @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); }