███████████████████████████
我写的三个函数,大奉献!! 记得要给分啊!!
███████████████████████████
//下面这个函数是新的算法,速度很要很多(差不多是原来的三分之一),不过并不适合所有的图片,只适合Y轴无凹形的图片(比如葫芦形)。
//思路如下:
// 1.找到开始有黑色的一行,并将行号存入currentRow中。并将该行中的左端点和右端点分别存放于 lastLeft 和 lastRight 变量中。然后跳出循环。
// 2.进入下一行。依据上一行的left和right来搜索本行的left和right。这样很快。找到后就合并区域。
// 3.循环直到有一行没有找到left和right(也就是没有黑色)就跳出。
//这个算法因为没有搜索图片的所有像素,所以快很多。希望能起个抛砖引玉的作用。
//此函数通过Y轴无凹形的图片(比如葫芦形)来创建区域。
function zjs_CreateYProtrudeImageRgn(imageFile:TFilename):HRGN;
label
firstLineFounded,L_leftFound,L_rightFound;
var
hRegion,hTmpRegion:HRGN; //hRegion:最终区域 hTmpRegion:临时区域
bitmap:TBitmap; //位图对象
left,right,lastLeft,lastRight,row,col,currentRow:integer;
started,leftFound,rightFound:boolean; //started:是否开始记录
begin
//初始化变量
started:=false;
currentRow:=0;
left:=-1; right:=-1;
hRegion:=createRectRgn(0,0,0,0);
bitmap:=TBitmap.Create;
try
bitmap.LoadFromFile(imageFile);
//找到第一行的left和right
for row:=0 to bitmap.Height-1 do
begin
for col:=0 to bitmap.Width-1 do
begin
if bitmap.Canvas.Pixels[col,row]=clBlack then //找到第一个黑点
begin
if not Started then
begin
started:=true;
left:=col; right:=col+1;
currentRow:=row; //记下当前是第几行
continue;
end
else
right:=col;
end;
end; { for col}
if started then
begin
hTmpRegion:=createRectRgn(left,row,right,row+1);
combineRgn(hRegion,hRegion,hTmpRegion,RGN_OR);
goto firstLineFounded;
end;
end; {for row}
firstLineFounded:
if (left<>-1) then //确认已经找到了第一条黑线
begin
lastLeft:=left; lastRight:=right;
for row:=currentRow+1 to bitmap.Height-1 do
begin
leftFound:=false;
rightFound:=false;
//找到本行的左边
if bitmap.Canvas.Pixels[0,row]=clBlack then
begin
left:=0;
leftFound:=true;
goto L_leftFound;
end
else
begin
col:=lastLeft;
while col>=0 do //往左搜索
begin
if (bitmap.Canvas.Pixels[col,row]<>clBlack) and (bitmap.Canvas.Pixels[col+1,row]=clBlack) then
begin
left:=col;
leftFound:=true;
goto L_leftFound;
end;
col:=col-1;
end;
col:=lastLeft;
while col<lastRight do //往右搜索
begin
if (bitmap.Canvas.Pixels[col,row]<>clBlack) and (bitmap.Canvas.Pixels[col+1,row]=clBlack) then
begin
left:=col;
leftFound:=true;
goto L_leftFound; //跳出循环
end;
col:=col+1;
end;
end;
L_leftFound:
//找到本行的右边
if bitmap.Canvas.Pixels[bitmap.Width-1,row]=clBlack then
begin
right:=bitmap.Width-1;
rightFound:=true;
goto L_rightFound;
end
else
begin
col:=lastRight;
while col<bitmap.Width-1 do //往右搜索
begin
if (bitmap.Canvas.Pixels[col,row]=clBlack) and (bitmap.Canvas.Pixels[col+1,row]<>clBlack) then
begin
right:=col+1;
rightFound:=true;
goto L_rightFound;
end;
col:=col+1;
end;
while col>lastLeft do //往左搜索
begin
if (bitmap.Canvas.Pixels[col,row]=clBlack) and (bitmap.Canvas.Pixels[col+1,row]<>clBlack) then
begin
right:=col+1;
rightFound:=true;
goto L_rightFound;
end;
col:=col-1;
end;
end;
L_rightFound:
if leftFound and rightFound then
begin
lastLeft:=left; lastRight:=right;
hTmpRegion:=createRectRgn(left,row,right,row+1);
combineRgn(hRegion,hRegion,hTmpRegion,RGN_OR);
end
else
break;
end; {for row}
end;
finally
bitmap.Free;
end;
result:=hRegion;
end;