CaptchaRecogition.ImageProcess.NotFourChars C# (CSharp) Метод

NotFourChars() приватный статический Метод

对第一次切割后不是4张小图的做处理
private static NotFourChars ( Image img, Bitmap &_bmp, List list, int charWidth ) : List
img Image
_bmp System.Drawing.Bitmap
list List
charWidth int
Результат List
        private static List<Boundary> NotFourChars(Image img, out Bitmap _bmp, List<Boundary> list,int charWidth)
        {
            if (list.Count == 0)
            {
                _bmp = TrimBmp(img);
                list.Add(new Boundary() { StartX = 0, EndX = _bmp.Height - 1, EndY = _bmp.Width - 1, StartY = 0 });
            }
            else
            {
                _bmp = new Bitmap(img);
            }
            if (list.Count == 1)
            {
                //平均切割
                Boundary bd = list[0];
                int _startY = bd.StartY;
                int _endY = _startY;
                int _startX = bd.StartX;
                int _endX = bd.EndX;
                int avr = (list[0].EndY - list[0].StartY) / 4-1;
                list.Clear();
                for (int i = 0; i < 4; i++)
                {
                    _endY = _startY + avr;
                    list.Add(new Boundary { EndY = _endY, EndX = _endX, StartY = _startY, StartX = _startX });
                    _startY = _endY+1;
                }
            }
            if (list.Count == 3)
            {
                Boundary max = list[0];
                int index = 0;
                for (int i = 1; i < list.Count; i++)
                {
                    Boundary _max = list[i];
                    if (max.EndY - max.StartY < _max.EndY - _max.StartY)
                    {
                        index = i;
                        max = _max;
                    }
                }
                //平分
                int _startY = max.StartY;
                int _endY = _startY;
                int _startX = max.StartX;
                int _endX = max.EndX;
                int avr = (max.EndY - max.StartY) / 2-1;
                list.Remove(max);
                for (int i = 0; i < 2; i++)
                {
                    _endY = _startY + avr;
                    list.Insert(index, new Boundary { EndY = _endY, EndX = _endX, StartY = _startY, StartX = _startX });
                    index = index + 1;
                    _startY = _endY + 1;
                }
            }
            if (list.Count == 2)
            {
                if (Math.Abs((list[1].EndY - list[1].StartY) - (list[0].EndY - list[0].StartY)) > 1.5*charWidth)
                {
                    Boundary max = (list[1].EndY - list[1].StartY) > (list[0].EndY - list[0].StartY)
                        ? list[1]
                        : list[0];
                    //平分
                    int index = (list[1].EndY - list[1].StartY) > (list[0].EndY - list[0].StartY) ? 1 : 0;
                    int _startY = max.StartY;
                    int _endY = _startY;
                    int _startX = max.StartX;
                    int _endX = max.EndX;
                    int avr = (max.EndY - max.StartY) / 3-1;
                    list.Remove(max);
                    for (int i = 0; i < 3; i++)
                    {
                        _endY = _startY + avr;
                        list.Insert(index,
                            new Boundary { EndY = _endY, EndX = _endX, StartY = _startY, StartX = _startX });
                        index = index + 1;
                        _startY = _endY + 1;
                    }
                }
                else
                {
                    List<Boundary> _temp = new List<Boundary>();
                    for (int i = 0; i < 2; i++)
                    {
                        Boundary max = list[i];
                        //平分
                        int _startY = max.StartY;
                        int _endY = _startY;
                        int _startX = max.StartX;
                        int _endX = max.EndX;
                        int avr = (max.EndY - max.StartY) / 2-1;
                        for (int j = 0; j < 2; j++)
                        {
                            _endY = _startY + avr;
                            _temp.Add(new Boundary { EndY = _endY, EndX = _endX, StartY = _startY, StartX = _startX });
                            _startY = _endY + 1;
                        }
                    }
                    list = _temp;
                }
            }
            return list;
        }