Einzelnen Beitrag anzeigen

berens

Registriert seit: 3. Sep 2004
434 Beiträge
 
Delphi 10.4 Sydney
 
#9

[Erledigt] BitmapCompare nicht zuverlässig / Scanline Problem?

  Alt 24. Jan 2019, 20:55
Nochmal danke für die Rückmeldungen.

Den "Äpfel mit Birnen"-Hinweis bezog ich die ganze Zeit darauf, dass ich an der einen Stele pix1=pix2 vergleiche, und an der anderen Stelle c1=c2. Aber -wenn ich's denn nun richtig verstehe- wolltest Du wohl sagen, pByte sich nicht für einen 4-Stelligen Byte-Vergleich eignet, respektive für die Arbeit mit Scanline generell. Das ist ein wichtiger Hinweis und kam bis dato bei mir so nicht an.

Mit dem Ansatz, dass schlicht der Datentyp für meine ScanLine-Variable falsch ist, habe ich hier im Forum wieder die Beispiele gefunden, die ich ursprünglich gesucht hatte. Diese arbeiten nicht mit pByte, sondern mit TRGBTripple(Array) oder TRGBQuad(Array) (teilweise selbstdefinierte Typen). Spontan konnte ich die Beispiele nicht adequat auf mein Problem übertragen (in den Beispielen ging es meist um's kopieren, nicht vergleichen), deshalb habe ich nochmal gegoogle und bin auf folgende Lösung gestoßen, die mein Problem löst, und nun auch mit Scanline die richtigen Werte zurückgibt:

https://www.tek-tips.com/viewthread.cfm?qid=1626211
Delphi-Quellcode:
function GetPixelSize(informat: TPixelFormat): Integer;
  // returns proper byte size for input
  begin
    case informat of
      pf8bit: Result := 1;
      pf16bit: Result := 2;
      pf24bit: Result := 3;
      pf32bit: Result := 4;
    else
      Result := 0;
    end;
  end;

function MyBitmapsAreSame(Bitmap1, Bitmap2: TBitmap): Boolean;
var
  scanptr1, scanptr2: pointer;
  i: integer;
  PixelSize: byte;
begin
  Result := false;
  if (Bitmap1.Width = Bitmap2.Width) and
     (Bitmap1.Height = Bitmap2.Height) and
     (Bitmap1.PixelFormat = Bitmap2.PixelFormat) then
    begin
      PixelSize := GetPixelSize(Bitmap1.PixelFormat);
      for i := 0 to (Bitmap1.Height-1) do
        begin
          scanptr1 := Bitmap1.ScanLine[i];
          scanptr2 := Bitmap2.ScanLine[i];
          Result := CompareMem(scanptr1, scanptr2, Bitmap1.Width*PixelSize);
          if Result = false then break;
        end;
    end;
end;
Nochmals danke für die Beiträge!
Delphi 10.4 32-Bit auf Windows 10 Pro 64-Bit, ehem. Delphi 2010 32-Bit auf Windows 10 Pro 64-Bit
  Mit Zitat antworten Zitat