function BitmapCompare(Bitmap1, Bitmap2: TBitmap; DifferentPixel: Integer): TRect;
var
y, x, CountDifferentPixel: Integer;
Bitmap1Pixel, Bitmap2Pixel: PRGBQuad;
// PRGBQuad def. in Unit Windows;
aRect: TRect;
begin
// ein Rechteck auf Min-und Maxwerte vordef.
aRect := Rect(65000, 65000, 0, 0);
CountDifferentPixel := 0;
for y := 0
to Bitmap1.Height - 1
do
begin
// Bitmaps Y Linie einlesen
Bitmap1Pixel := Bitmap1.ScanLine[y];
Bitmap2Pixel := Bitmap2.ScanLine[y];
for x := 0
to Bitmap2.Width - 1
do
begin
// Pixel farbwerte vergleichen zw. Bitmap1Pixel u. Bitmap2Pixel
if RGB(Bitmap1Pixel^.rgbRed, Bitmap1Pixel^.rgbGreen, Bitmap1Pixel^.rgbBlue) <>
RGB(Bitmap2Pixel^.rgbRed, Bitmap2Pixel^.rgbGreen, Bitmap2Pixel^.rgbBlue)
then
begin
// das Rechteck (aRect) auf die Werte der unterschiedlichen
// Pixel erweitern die ausserhab des Bereiches des Rechtecks liegen
if x < aRect.Left
then aRect.Left := x;
if y < aRect.Top
then aRect.Top := y;
if x > aRect.Right
then aRect.Right := x;
if y > aRect.Bottom
then aRect.Bottom := y;
Inc(CountDifferentPixel);
end;
// Zeiger auf nächsten Pixel setzen
Inc(Bitmap1Pixel);
Inc(Bitmap2Pixel);
end;
end;
// keinen Unterschied gefunden dann kein Rechteck ansonsten
// das Rechteck zurückgeben in dem sich die Pixel unterscheiden.
if CountDifferentPixel > DifferentPixel
// Grosse des Schwellwerts der Unterschiede
then Result := TRect(0, 0, 0, 0)
else Result := aRect;
end;
// Umwandeln eines Bitmaps in Grauwerte auf einfache Art und Weise (eine Möglichkeit von vielen)
procedure MakeGreyBitmap(aBitmap: TBitmap);
var
PixelLine: PByteArray;
x, y: integer;
begin
aBitmap.PixelFormat := pf24Bit;
for y := 0
to aBitmap.height - 1
do
begin
PixelLine := aBitmap.ScanLine[y];
for x := 0
to aBitmap.width - 1
do
begin
PixelLine^[x*3] := (PixelLine^[x*3] + PixelLine^[x*3+1] + PixelLine^[x*3+2])
div 3;;
PixelLine^[x*3+1] := PixelLine^[x*3];
PixelLine^[x*3+2] := PixelLine^[x*3];
end;
end;
end;
// Aufruf zB. so, hier wir in ein Preview Bitmap ein
// Rechteck gezeichnet in dem ein Unterschied vorliegt.
// ...
MakeGreyBitmap(BitmapAlt);
MakeGreyBitmap(BitmapNeu);
PreviewBitmap.Canvas.Rectangle(BitmapCompare(BitmapAlt, BitmapNeu, 1000));