function
Create_16x16(Img: TBitmap): TMas16x16;
type
MasX = PByteArray;
var
MasY:
array
of
MasX;
j, i:
Integer
;
xLeft, xRight, yTop, yBottom:
Integer
;
ki, kj:
Integer
;
nSymbol:
Integer
;
Percent:
double
;
XY:
array
[
0
..
16
]
of
record
X, Y:
Integer
end
;
W, H:
Integer
;
begin
SetLength(MasY, Img
.
Height);
for
j :=
0
to
Img
.
Height -
1
do
MasY[j] := Img
.
ScanLine[j];
xLeft := -
1
;
xRight := -
1
;
yTop := -
1
;
yBottom := -
1
;
for
j :=
0
to
Img
.
Height -
1
do
begin
for
i :=
0
to
Img
.
Width -
1
do
if
MasY[j][i] =
0
then
begin
yTop := j;
break;
end
;
if
yTop = j
then
break;
end
;
for
j := Img
.
Height -
1
downto
0
do
begin
for
i :=
0
to
Img
.
Width -
1
do
if
MasY[j][i] =
0
then
begin
yBottom := j +
1
;
break;
end
;
if
yBottom = j +
1
then
break;
end
;
for
i :=
0
to
Img
.
Width -
1
do
begin
for
j :=
0
to
Img
.
Height -
1
do
if
MasY[j][i] =
0
then
begin
xLeft := i;
break;
end
;
if
xLeft = i
then
break;
end
;
for
i := Img
.
Width -
1
downto
0
do
begin
for
j :=
0
to
Img
.
Height -
1
do
if
MasY[j][i] =
0
then
begin
xRight := i +
1
;
break;
end
;
if
xRight = i +
1
then
break;
end
;
if
((yBottom - yTop) * (xRight - xLeft)) =
0
then
begin
exit;
end
;
nSymbol :=
0
;
for
j := yTop
to
yBottom-
1
do
for
i := xLeft
to
xRight-
1
do
if
MasY[j][i] =
0
then
inc(nSymbol);
Percent := nSymbol / ((yBottom - yTop) * (xRight - xLeft));
Percent :=
0.99
* Percent;
W := xRight - xLeft;
XY[
0
].X :=
0
;
XY[
16
].X := W;
XY[
8
].X := XY[
16
].X
div
2
;
XY[
4
].X := XY[
8
].X
div
2
;
XY[
2
].X := XY[
4
].X
div
2
;
XY[
1
].X := XY[
2
].X
div
2
;
XY[
3
].X := (XY[
4
].X + XY[
2
].X)
div
2
;
XY[
6
].X := (XY[
8
].X + XY[
4
].X)
div
2
;
XY[
5
].X := (XY[
6
].X + XY[
4
].X)
div
2
;
XY[
7
].X := (XY[
8
].X + XY[
6
].X)
div
2
;
XY[
12
].X := (XY[
16
].X + XY[
8
].X)
div
2
;
XY[
10
].X := (XY[
12
].X + XY[
8
].X)
div
2
;
XY[
14
].X := (XY[
16
].X + XY[
12
].X)
div
2
;
XY[
9
].X := (XY[
10
].X + XY[
8
].X)
div
2
;
XY[
11
].X := (XY[
12
].X + XY[
10
].X)
div
2
;
XY[
13
].X := (XY[
14
].X + XY[
12
].X)
div
2
;
XY[
15
].X := (XY[
16
].X + XY[
14
].X)
div
2
;
H := yBottom - yTop;
XY[
0
].Y :=
0
;
XY[
16
].Y := H;
XY[
8
].Y := XY[
16
].Y
div
2
;
XY[
4
].Y := XY[
8
].Y
div
2
;
XY[
2
].Y := XY[
4
].Y
div
2
;
XY[
1
].Y := XY[
2
].Y
div
2
;
XY[
3
].Y := (XY[
4
].Y + XY[
2
].Y)
div
2
;
XY[
6
].Y := (XY[
8
].Y + XY[
4
].Y)
div
2
;
XY[
5
].Y := (XY[
6
].Y + XY[
4
].Y)
div
2
;
XY[
7
].Y := (XY[
8
].Y + XY[
6
].Y)
div
2
;
XY[
12
].Y := (XY[
16
].Y + XY[
8
].Y)
div
2
;
XY[
10
].Y := (XY[
12
].Y + XY[
8
].Y)
div
2
;
XY[
14
].Y := (XY[
16
].Y + XY[
12
].Y)
div
2
;
XY[
9
].Y := (XY[
10
].Y + XY[
8
].Y)
div
2
;
XY[
11
].Y := (XY[
12
].Y + XY[
10
].Y)
div
2
;
XY[
13
].Y := (XY[
14
].Y + XY[
12
].Y)
div
2
;
XY[
15
].Y := (XY[
16
].Y + XY[
14
].Y)
div
2
;
for
kj :=
0
to
15
do
for
ki :=
0
to
15
do
begin
nSymbol :=
0
;
for
j := yTop + XY[kj].Y
to
((yTop + XY[kj +
1
].Y)-
1
)
do
for
i := xLeft + XY[ki].X
to
((xLeft + XY[ki +
1
].X)-
1
)
do
if
MasY[j][i] =
0
then
inc(nSymbol);
if
nSymbol / MAX(
1
, ((
1
+XY[ki +
1
].X - XY[ki].X) * (
1
+XY[kj +
1
].Y - XY[kj].Y)
)) > Percent
then
Result[kj][ki] :=
1
else
Result[kj][ki] :=
0
;
end
;
SetLength(MasY,
0
);
end
;