Hi.
Folgender Code ermöglicht das schnelle Vergleichen zweier Bitmaps und gibt, falls sie nicht identisch sind, ihre Unterschiede in Pixel aus. Der Algorithmus war ein Teil eines Jugend forscht Projektes und hat sich als schnellster unter vielen erwiesen. Ein Bild von 1024*768 wird auf einem AMD Athlon XP 2600+ @ 1,9 GHz in 4,4ms verglichen.
Delphi-Quellcode:
type
PRGBTripleArray = ^TRGBTripleArray;
TRGBTripleArray =
array [0..50000000]
of TRGBTriple;
function CompareImages(Image1,Image2:TBitmap):Int64;
var x,y:integer;
P1,P2:PRGBTripleArray;
summe1,summe2:integer;
begin
result := 0;
summe1 := 0;
summe2 := 0;
for y := 0
to Image1.Height -1
do
begin
P1 := Image1.ScanLine[y];
P2 := Image2.ScanLine[y];
if not CompareMem(p1,p2,Image1.Width*SizeOf(TRGBTriple))
then
begin
for x := 0
to Image1.Width-1
do
begin
inc(summe1,
RGB(P1[x].rgbtRed,P1[x].rgbtGreen,P1[x].rgbtBlue));
inc(summe2,
RGB(P2[x].rgbtRed,P2[x].rgbtGreen,P2[x].rgbtBlue));
if summe1 <> summe2
then
begin
summe1 := 0;
summe2 := 0;
inc(result);
end;
end;
end;
end;
Application.ProcessMessages;
end;
Ein Aufruf könnte so erfolgen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(CompareImages(Image1.Picture.Bitmap,Image2.Picture.Bitmap)));
end;
Bei Rückfragen einfach melden.
Hf, Flips
Philipp F.