稍后提交一个完整的测试程序
1
2
BOOL WINAPI TraceDIB(LPSTR lpDIBBits,LONG lWidth,LONG lHeight,CArray
<
CPoint,CPoint
>*
pPoint,CArray
<
int
,
int
>*
pSlope)
3![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
4
// 指向源图像的指针
5
BYTE*lpSrc;
6![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
7
// 指向缓存图像的指针
8
BYTE*lpDst;
9![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
10
// 指向缓存DIB图像的指针
11
BYTE*lpNewDIBBits;
12
HLOCALhNewDIBBits;
13![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
14
// 图像每行的字节数
15
LONG lLineBytes=WIDTHBYTES(lWidth * 8);
16![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
17
long i,j;
18
DWORD ii=0;
19![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
20
BYTE pixel;
21
bool bFindStartPoint;
22![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
23
//是否扫描到一个边界点
24
bool bFindPoint;
25![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
26![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
27
//起始边界点与当前边界点
28
CPoint StartPoint,CurrentPoint;
29
//顺时针方向
30![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
int Direction[8][2]=
{
{1,0},
{1,-1},
{0,-1},
{-1,-1},
{-1,0},
{-1,1},
{0,1},
{1,1}};
31
int BeginDirect;
32![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
33
hNewDIBBits = LocalAlloc(LHND, lLineBytes * lHeight);
34
if (hNewDIBBits == NULL)
35![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
{
36
// 分配内存失败
37
return FALSE;
38
}
39
lpNewDIBBits = (BYTE* )LocalLock(hNewDIBBits);
40
// 初始化新分配的内存,设定初始值为255
41
lpDst = (BYTE*)lpNewDIBBits;
42
memset(lpDst, (BYTE)255, lLineBytes * lHeight);
43![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
44![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
45
//先找到最左下方的边界点
46
bFindStartPoint = false;
47
for (j = 0;j < lHeight && !bFindStartPoint;j++)
48![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
{
49
for(i = 0;i < lWidth && !bFindStartPoint;i++)
50![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
{
51
// 指向源图像倒数第j行,第i个象素的指针
52
lpSrc = (BYTE *)lpDIBBits + lLineBytes * j + i;
53![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
54
pixel = (BYTE)*lpSrc;
55![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
56
if(pixel == 0)
57![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
{
58
bFindStartPoint = true;
59![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
60
StartPoint.y = j;
61
StartPoint.x = i;
62![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
63
// 指向目标图像倒数第j行,第i个象素的指针
64
lpDst = (BYTE *)lpNewDIBBits + lLineBytes * j + i;
65
*lpDst = (BYTE)0;
66
}
67
}
68
}
69![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
70
//由于起始点是在左下方,故起始扫描沿左上方向
71
BeginDirect = 5;
72
//跟踪边界
73
bFindStartPoint = false;
74
//从初始点开始扫描
75
CurrentPoint.y = StartPoint.y;
76
CurrentPoint.x = StartPoint.x;
77
pPoint->Add(CurrentPoint);
78
// 第一个点的斜率为2
79
pSlope->Add(int(2));
80
ii++;
81![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
82
while(!bFindStartPoint)
83![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
{
84
bFindPoint = false;
85
while(!bFindPoint)
86![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
{
87
//沿扫描方向查看一个像素
88
long offset = lLineBytes * ( CurrentPoint.y + Direction[BeginDirect][1])
89
+ (CurrentPoint.x + Direction[BeginDirect][0]);
90
lpSrc = (unsigned char *)lpDIBBits + offset;
91
lpDst = (unsigned char *)lpNewDIBBits + offset;
92
pixel = (unsigned char)*lpSrc;
93![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
94
if(pixel == 0&&(unsigned char)*lpDst==255)
95![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
{
96
bFindPoint = true;
97
CurrentPoint.y = CurrentPoint.y + Direction[BeginDirect][1];
98
CurrentPoint.x = CurrentPoint.x + Direction[BeginDirect][0];
99
pPoint->Add(CurrentPoint);
100![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
101
// s = BeginDirect%4;
102
//if(s==3)
103
//s = -1;
104
//左上方代表方向的5,以后按照
105
pSlope->Add(BeginDirect);//s;
106
ii++;
107
*lpDst = (unsigned char)0;
108
//扫描的方向逆时针旋转两格
109
BeginDirect--;
110
if(BeginDirect == -1)
111
BeginDirect = 7;
112
BeginDirect--;
113
if(BeginDirect == -1)
114
BeginDirect = 7;
115
}
116
else
117![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
{
118
if(pixel!=0)
119![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
{
120
//扫描方向顺时针旋转一格
121
BeginDirect++;
122
if(BeginDirect == 8)
123
BeginDirect = 0;
124
}
125![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
else
{
126
// 扫描到以扫过的点
127
bFindPoint = true;
128
bFindStartPoint = true;
129
}
130
}
131![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
132
}
133
}
134![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
135
ASSERT(pPoint->GetSize()==ii);
136![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
137
// 复制腐蚀后的图像
138
memcpy(lpDIBBits, lpNewDIBBits, lWidth * lHeight);
139![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
140
// 释放内存
141
LocalUnlock(hNewDIBBits);
142
LocalFree(hNewDIBBits);
143![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
144
// 返回
145
return TRUE;
146
}
147![None.gif](/Images/OutliningIndicators/None.gif)
148
![None.gif](/Images/OutliningIndicators/None.gif)
2
![None.gif](/Images/OutliningIndicators/None.gif)
3
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
![dot.gif](/Images/dot.gif)
4
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
5
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
6
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
7
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
8
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
9
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
10
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
11
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
12
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
13
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
14
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
15
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
16
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
17
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
18
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
19
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
20
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
21
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
22
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
23
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
24
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
25
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
26
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
27
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
28
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
29
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
30
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
![dot.gif](/Images/dot.gif)
![dot.gif](/Images/dot.gif)
![dot.gif](/Images/dot.gif)
![dot.gif](/Images/dot.gif)
![dot.gif](/Images/dot.gif)
![dot.gif](/Images/dot.gif)
![dot.gif](/Images/dot.gif)
![dot.gif](/Images/dot.gif)
31
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
32
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
33
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
34
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
35
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
36
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
37
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
38
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
39
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
40
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
41
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
42
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
43
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
44
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
45
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
46
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
47
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
48
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
49
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
50
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
51
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
52
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
53
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
54
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
55
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
56
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
57
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
58
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
59
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
60
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
61
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
62
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
63
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
64
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
65
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
66
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
67
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
68
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
69
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
70
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
71
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
72
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
73
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
74
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
75
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
76
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
77
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
78
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
79
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
80
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
81
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
82
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
83
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
84
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
85
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
86
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
87
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
88
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
89
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
90
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
91
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
92
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
93
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
94
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
95
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
96
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
97
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
98
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
99
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
100
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
101
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
102
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
103
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
104
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
105
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
106
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
107
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
108
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
109
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
110
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
111
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
112
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
113
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
114
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
115
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
116
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
117
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
118
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
119
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
120
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
121
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
122
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
123
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
124
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
125
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
126
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
127
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
128
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
129
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
130
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
131
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
132
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
133
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
134
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
135
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
136
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
137
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
138
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
139
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
140
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
141
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
142
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
143
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
144
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
145
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
146
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
147
![None.gif](/Images/OutliningIndicators/None.gif)
148
![None.gif](/Images/OutliningIndicators/None.gif)