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;