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;
}