Also PByteArray ist ein Zeiger auf TByteArray und TByteArray ist als "Array[0..32767] of Byte" definiert.
Length(P) hätte eh nicht funktioniert, da P ein Pointer ist und immer 4 Byte (derzeit) ist
So, das mit CompareMem läuft jetzt:
Delphi-Quellcode:
Procedure TForm1.Button1Click(Sender: TObject);
Var i, R, W, L, X: Integer;
BitMap, BitMap2: TBitMap;
Begin
BitMap := TBitMap.create;
BitMap2 := TBitMap.create;
BitMap.LoadFromFile('vorlage.bmp'); //Laden der ausgangsdatei
BitMap2.LoadFromFile('screenshot.bmp'); //Laden der vergleichsdatei
If BitMap.PixelFormat <> BitMap2.PixelFormat Then
Label1.Caption := 'unterschiedliches Pixelformat'
Else If (BitMap.Width <> BitMap2.Width) and (BitMap.Height <> BitMap2.Height) Then
Label1.Caption := 'unterschiedliche Bildgröße'
Else Begin
R := 0; W := 0;
Case BitMap.PixelFormat of
pf1bit: L := Ceil(BitMap.Width / 8);
pf4bit: L := Ceil(BitMap.Width / 2);
pf8bit: L := BitMap.Width;
pf15bit: L := Ceil(BitMap.Width * 15 / 8); {ich hoffe mal das für die 15 Bit stimmt}
pf16bit: L := BitMap.Width * 2;
pf24bit: L := BitMap.Width * 3;
pf32bit: L := BitMap.Width * 4;
End;
For i := 0 to BitMap.Height - 1 do
If CompareMem(BitMap.ScanLine[i], BitMap2.ScanLine[i], L) Then Inc(R) Else Inc(W);
Label1.Caption := IntToStr(R) + ' gleiche und ' + IntToStr(W) + ' unterschiedliche Zeilen';
End;
End;