Neben den Punkten die Volker bereits aufgeführt hat greifst Du mit
Zitat:
0 to Bild.Width
schon 1 zu weit zu ...
Statt des ByteArray kannst Du eine Array of TRGBQuad verwenden
Delphi-Quellcode:
uses exgdi,exgdipapi,exgdipobj;
{$R *.dfm}
type
pRGBQuadArray = ^TRGBQuadArray;
TRGBQuadArray = ARRAY[0..$effffff] OF TRGBQuad;
....
var
pscanLine32 : pRGBQuadArray;
i,j:Integer;
begin
Bmp.PixelFormat := pf32Bit;
for i := 0 to bmp.Height -1 do
begin
pscanLine32 := bmp.Scanline[i];
for j := 0 to bmp.Width -1 do
begin
... pscanLine32[j].rgbReserved ...
... pscanLine32[j].rgbBlue ...
... pscanLine32[j].rgbRed ...
... pscanLine32[j].rgbGreen ...
end;
end;
end;
Der Umweg über String und ein Memo im besonderen werden das ganze extrem ausbremsen.
Ich würde den Vergleich direkt über die Scanlines machen
Pseudocodefetzen
Delphi-Quellcode:
...
Pixelidentisch := true;
//Loop über i/j Bild1 x/y Bild2 mit Abbruch wenn nicht Pixelidentisch
//wenn x und y die Breite und Höhe erreicht haben und Pixelidentisch dann gefunden
//das ganze dann jeweils mit erhöhten i und j Werten bis Pixelidentisch oder alles durchsucht
Pixelidentisch := Pixelidentisch AND (Integer(pscanLineBitmap1[j]) = Integer(pscanLineBitmap2[x]));
...