您的位置:首页 > 其它

简单的图片对比函数

2011-12-06 11:43 337 查看
function Compare(bit1: TBitmap; bit2: TBitmap; nC: Integer; Img: TImage): Integer;
var
x,y , nRe: Integer;
bx, by, bbs: Byte;
bColor: TColor;
temBit: TBitmap;
begin
if Img <> nil then
begin
temBit := TBitmap.Create;
temBit.Width := bit1.Width;
temBit.Height := bit1.Height;
end;

nRe := 0;
for x := 0 to bit1.Width -1 do
begin
for y:= 0 to bit1.Height -1 do
begin
bx := GetBValue(bit1.Canvas.pixels[x,y]);
by := GetBValue(bit2.Canvas.pixels[x,y]);
bbs := abs(bx- by);
if bbs < nC then
begin
bColor := clBlack;
end else
begin
bColor := clWhite;
Inc(nRe);
end;
if Img <> nil then
temBit.Canvas.pixels[x,y]:= bColor;
end;
end;
if Img <> nil then
Img.Picture.Bitmap.Assign(temBit);
temBit.Free;
Result := nRe;
end;


//一种更快的方法
function Compare2(bit1: TBitmap; bit2: TBitmap; nC: Integer; Img: TImage): Integer;
var
x,y , nRe: Integer;
bbs: Byte;
bColor: TColor;
temBit: TBitmap;
pix1, pix2: PByteArray;
begin
if Img <> nil then
begin
temBit := TBitmap.Create;
temBit.Width := bit1.Width;
temBit.Height := bit1.Height;
end;

nRe := 0;
for y:= 0 to bit1.Height -1 do
begin
pix1 := bit1.Scanline[y];
pix2 := bit2.Scanline[y];
for x:= 0 to bit1.Width-1 do
begin
bbs := abs(pix1[x*3]- pix2[x*3]);
if bbs < nC then
begin
bColor := clBlack;
end else
begin
bColor := clWhite;
Inc(nRe);
end;
if Img <> nil then
temBit.Canvas.pixels[x,y]:= bColor;
end;
end;
if Img <> nil then
begin
Img.Picture.Bitmap.Assign(temBit);
temBit.Free;
end;
Result := nRe;
end;


取灰度值, 设置容差, 返回差度

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: