简单的图片对比函数

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;

 

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

posted @ 2011-12-06 11:43  小阿枫  阅读(383)  评论(0编辑  收藏  举报