D
dldengli
Unregistered / Unconfirmed
GUEST, unregistred user!
有两张图片,其中有部分区域是不同的,要求能快速找出不同区域的RECT。以下是小弟我写的,但速度那是不堪忍受啊[
]。望各位高手、大虾门明白我的意思帮我想出快速的算法来小第在此先谢过了!!!。可以使用线程最好不要超过2个。
function CpBmp(var B1, B2: TBitmap): TRect;
var
R1, R2 : pRGBArray;
i, l : integer;
x1, x2, y1, y2 : integer;
bb:boolean;
begin
bb:= false;
for i:= 0 to B1.Height - 1 do
begin
if bb then break;
R1:= B1.ScanLine;
R2:= B2.ScanLine;
for l:= 0 to B1.Width -1 do
begin
if rgb(R1[l].rgbtRed,r1[l].rgbtGreen,r1[l].rgbtBlue) <>
rgb(R2[l].rgbtRed,r2[l].rgbtGreen,r2[l].rgbtBlue) then
begin
y1:= i;
bb:= true;
break;
end;
end;
end;
bb:= false;
for i:= B1.Height - 1 downto 0 do
begin
if bb then break;
R1:= B1.ScanLine;
R2:= B2.ScanLine;
for l:= 0 to B1.Width -1 do
begin
if rgb(R1[l].rgbtRed,r1[l].rgbtGreen,r1[l].rgbtBlue) <>
rgb(R2[l].rgbtRed,r2[l].rgbtGreen,r2[l].rgbtBlue) then
begin
y2:= i;
bb:= true;
Break;
end;
end;
end;
bb:= false;
for i:= 0 to B1.Width - 1 do
begin
if bb then break;
for l:= 0 to B1.Height - 1 do
begin
if b1.Canvas.Pixels[i,l] <> b2.Canvas.Pixels[i,l] then
begin
x1:= i;
bb:= true;
Break;
end;
end;
end;
bb:= false;
for i:= B1.Width - 1 downto 0 do
begin
if bb then break;
for l:= 0 to B1.Height - 1 do
begin
if b1.Canvas.Pixels[i,l] <> b2.Canvas.Pixels[i,l] then
begin
x2:= i;
bb:= true;
Break;
end;
end;
end;
Result:= Rect(x1,y1,x2,y2);
end;
![Frown :( :(](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f641.png)
function CpBmp(var B1, B2: TBitmap): TRect;
var
R1, R2 : pRGBArray;
i, l : integer;
x1, x2, y1, y2 : integer;
bb:boolean;
begin
bb:= false;
for i:= 0 to B1.Height - 1 do
begin
if bb then break;
R1:= B1.ScanLine;
R2:= B2.ScanLine;
for l:= 0 to B1.Width -1 do
begin
if rgb(R1[l].rgbtRed,r1[l].rgbtGreen,r1[l].rgbtBlue) <>
rgb(R2[l].rgbtRed,r2[l].rgbtGreen,r2[l].rgbtBlue) then
begin
y1:= i;
bb:= true;
break;
end;
end;
end;
bb:= false;
for i:= B1.Height - 1 downto 0 do
begin
if bb then break;
R1:= B1.ScanLine;
R2:= B2.ScanLine;
for l:= 0 to B1.Width -1 do
begin
if rgb(R1[l].rgbtRed,r1[l].rgbtGreen,r1[l].rgbtBlue) <>
rgb(R2[l].rgbtRed,r2[l].rgbtGreen,r2[l].rgbtBlue) then
begin
y2:= i;
bb:= true;
Break;
end;
end;
end;
bb:= false;
for i:= 0 to B1.Width - 1 do
begin
if bb then break;
for l:= 0 to B1.Height - 1 do
begin
if b1.Canvas.Pixels[i,l] <> b2.Canvas.Pixels[i,l] then
begin
x1:= i;
bb:= true;
Break;
end;
end;
end;
bb:= false;
for i:= B1.Width - 1 downto 0 do
begin
if bb then break;
for l:= 0 to B1.Height - 1 do
begin
if b1.Canvas.Pixels[i,l] <> b2.Canvas.Pixels[i,l] then
begin
x2:= i;
bb:= true;
Break;
end;
end;
end;
Result:= Rect(x1,y1,x2,y2);
end;