Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.418 Beiträge
 
Delphi 7 Professional
 
#3

AW: Bilder Checksumme zum vergleichen

  Alt 14. Feb 2019, 14:26
ImageEn ist gut.

Habe damit mal 'nen Ansatz gemacht (aber nicht weiterverfolgt):

Bilder in Graustufen verwandeln und auf z. B. 20 * 20 Pixel verkleiner, über das Ergebnis eine MD5-Checksumme erstellen und die in der Datenbank speichern.

Findet einiges, aber lange nicht alles.

Grob sowas:
Delphi-Quellcode:
function GetGrayScaleString(b: Graphics.TBitmap) : String;
var
  sl : pRGBArray; {Scanline}
  s : String;
  i : Integer;
  j : Integer;
  Colr : Integer;
begin
  Result := '';
  if b.PixelFormat <> pf24bit then begin
    Result := '<kein gültiges Bild>';
    Exit;
  end;
  s := '';
  for j := 0 to b.Height - 1 do begin
    sl := b.ScanLine[j];
    for i := 0 to b.Width - 1 do begin
      Colr := HiByte(sl[i].rgbtRed * 77 + sl[i].rgbtGreen * 151 + sl[i].rgbtBlue * 28);
      s := s + IntToHex(Colr,2);
    end;
  end;
  Result := s;
end;

function GetImageString(b: Graphics.TBitmap) : String;
var
  bmp : Graphics.TBitmap;
  Rect : TRect;
begin
  bmp := Graphics.TBitmap.Create;
  bmp.PixelFormat := pf24bit;
  bmp.Width := 20;
  bmp.Height := 20;
  Rect.Left := 0;
  Rect.Top := 0;
  Rect.Right := 20;
  Rect.Bottom := 20;
  bmp.Canvas.StretchDraw(Rect,b);
  Result := GetGrayScaleString(bmp);
  bmp.Free;
end;

function GetImageStringMD5(s : String) : String;
var
  Digest : array[0..15] of byte;
  i : Integer;
begin
  md5.Init;
  md5.UpdateStr(s);
  md5.Final(Digest);
  Result := '';
  for i := 0 to 15 do Result := Result + IntToHex(Digest[i],2);
end;
Statt mit Strings kannst Du das Bitmap auch als Stream speichern und dann über diesen die MD5-Checksumme bilden lassen.
Delphi-Quellcode:
function GetImageStringMD5(b : Graphics.TBitmap) : String;
var
  Digest : array[0..15] of byte;
  i : Integer;
  st : TMemoryStream;
begin
  st := TMemoryStream.Create;
  b.SaveToStream(st);
  st.Position := 0;
  md5.Init;
  md5.UpdateStream(st,st.Size);
  md5.Final(Digest);
  Result := '';
  for i := 0 to 15 do Result := Result + IntToHex(Digest[i],2);
end;
  Mit Zitat antworten Zitat