// Hiermit kann man zwei TBitmap auf Gleichheit prüfen (und so feststellen
// ob in einem von zwei scheinbar gleichen Bildern Informationen versteckt
// sind, wie z.B. Digimarc-Wasserzeichen o.ä.).
// siehe auch: 
Binäre Dateien vergleichen

// Getestet mit D4 unter Win98

function breitenwert(bm:TBitmap):integer;
begin
case bm.pixelformat of
pf32bit:result:=bm.width*4;
pf24bit:result:=bm.width*3;
pf16bit,pf15bit:result:=bm.width*2;
pf8bit:result:=bm.width;
pf4bit:result:=bm.width div 2 + 1;
pf1bit:result:=bm.width div 8 + 1;
else result:=0;
end;
dec(result);
end;

function
istgleich(bm1,bm2:TBitmap):integer;
var x,y,br:integer;
p1,p2:PByteArray;
begin
result:=-1;
br:=breitenwert(bm1);
if br < 1 then exit;
result:=0;
if (bm1.width<>bm2.width)or(bm1.height<>bm2.height)
or(bm1.pixelformat<>bm2.pixelformat)then exit;
for x:=0 to bm1.height-1 do begin
p1:=bm1.scanline[x];
p2:=bm2.scanline[x];
for y:=0 to br do
if p1[y]<>p2[y] then exit;
end;
result:=1;
end;

procedure
anzeigen(v:integer);
begin
case v of
-1:showmessage('Die Bilder können nicht verglichen werden.');
0:showmessage('Die Bilder sind ungleich.');
1:showmessage('Die Bilder sind gleich.');
end;
end;

procedure
TForm1.Button5Click(Sender: TObject);
var bm1,bm2:TBitmap;
begin
bm1:=TBitmap.create;
bm2:=TBitmap.create;
bm1.loadfromfile('d:\bilder\corel009.bmp');
bm2.loadfromfile('d:\bilder\corel009.bmp');
anzeigen(istgleich(bm1,bm2));
bm2.loadfromfile('d:\bilder\corel004.bmp');
anzeigen(istgleich(bm1,bm2));
bm2.free;
bm1.free;
end;


Zugriffe seit 6.9.2001 auf Delphi-Ecke