Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Hash eines Bildes? (https://www.delphipraxis.net/93466-hash-eines-bildes.html)

gandime 6. Jun 2007 11:35


Hash eines Bildes?
 
hi,
Ich möchte ein Programm schreiben, welches ein Bild einen wert o.ä. entnimmt, damit ich es mit einem anderen vergleichen kann und ggf. darauf handle.
Das ganze soll dann über das Inet laufen, weshalb ich nicht die Bilder verschicken möchte sondern einen Wert.
Ich habe mir schon überlegt die Byte Zahl zu verschicken daher das ist glaube etwas ungenau oder?
Und den Wert zu ermitteln sollte keinen großen Rechenaufwand sein, da viele Bilder nacheinander einen Wert bekommen sollen!

Gibt es eine Möglichkeit dafür?

mfg
gandime

Nikolas 6. Jun 2007 11:36

Re: ein Quersumme oder sowas in der Art eines Bildes?
 
So etwas nennt sich Hash. Einfach mal danach suchen, vielleicht findest du direkt eine Funktion, der du eine Datei übergibst, und die dir dann den Hashwert liefert.

gandime 6. Jun 2007 12:02

Re: ein Quersumme oder sowas in der Art eines Bildes?
 
das einzige sinnvolle was ich gefunden habe is folgendes:
Zitat:

Zunächst mußt du das bild laden. Danach verkleinerst du das Bild auf z.b. 16x16. Anschliessend liest du alle pixel des bildes aus, je nach farbe getrennt. Das ist dein Bildhash. Wenn du jetzt bilder mit einander vergleichst, mußt du die differenzen beider hasches über die stringlänge zusammen addieren und durch die anzahl der bytes teilen. Dann mußt du über den dreisatz einmal ermitteln, wie viel proznt das sind. Anhand der prozentzahl siehst du, ob die bilder gleich sind oder nicht. Bei mir hat sich herrausgestellt, das ein Schwellwert von 4% am besten geeignet ist
quelle: http://entwickler-forum.de/archive/i...p/t-25168.html

bis jetzt habe ich folgendes:
Delphi-Quellcode:
  for I := 0 to b_temp.Width - 1 do
  begin
    for ii := 0 to b_temp.Height - 1 do
    begin
      i_z_wert:=b_temp.Pixel[i,ii]//hier


    end;
  end;
an der Makierten stelle ist meine erste Frage wie bekomme ich von dem Pixel die rot blau gelb Werte und wie werden sie zusammengerechnet?

edit:
hab ich das so jetzt richtig gemacht?
Delphi-Quellcode:
var
  b_temp:tbitmap32;
  i,ii,i_size,i_z_wert:integer;
  r_temp:real;
  st_temp:tmemorystream;
  s_temp:string;
begin
  b_temp:=tbitmap32.create;
  b_temp.LoadFromFile('a.bmp');
  i_z_wert:=0;
  for I := 0 to b_temp.Width - 1 do
  begin
    for ii := 0 to b_temp.Height - 1 do
    begin
      i_z_wert:=i_z_wert+GetRValue(b_temp.pixel[i,ii]);
      i_z_wert:=i_z_wert+GetGValue(b_temp.pixel[i,ii]);
      i_z_wert:=i_z_wert+GetBValue(b_temp.pixel[i,ii]);
    end;
  end;
  st_temp:=tmemorystream.create;
  b_temp.SaveToStream(st_temp);
  i_size:=st_temp.Size;
  st_temp.free;
  b_temp.Free;
  s_temp:=inttostr(i_z_wert);
  r_temp:=length(s_temp)/i_size;
  showmessage(floattostr(r_temp));

GTA-Place 6. Jun 2007 12:44

Re: Hash eines Bildes?
 
Frage: Brauchst du unbedingt einen Toleranz-Wert? Wenn du nur wissen willst, ob das exakt die selbe Datei ist, gibt es bessere Verfahren.

gandime 6. Jun 2007 12:56

Re: Hash eines Bildes?
 
so das Problem dabei is das es im Prinziep das selbe Bild ist aber ich wandele es vorher in jpg um.
Ist es denn möglich dass der Sich das bild dann minimal ändert?

GTA-Place 6. Jun 2007 13:01

Re: Hash eines Bildes?
 
Dann wird der Header anders und die Checksum (Hash) würde was anderes ergeben.

gandime 6. Jun 2007 13:15

Re: Hash eines Bildes?
 
wie kann ich das vermeiden?

himitsu 6. Jun 2007 13:37

Re: Hash eines Bildes?
 
garnicht.

würde es dir aber nichr reichen, wenn du das Änderungsdatum der Dateien prüfst?

du könntest in diesem Falls höchstens den Dateiinhalt, also die Pixel selber vergleichen, aber da im JPeg die Pixel sich ebenfalls verändern (Aufgrund der Komprimierung) könnte man da nur mit näherunswerten vergleichen, welches wiederrum nicht über einen Hash (über die die/das gesamte Datei/Bild) möglich wäre.

gandime 6. Jun 2007 13:46

Re: Hash eines Bildes?
 
nein das geht nicht da das Bild immer wieder neu gemacht wird!
dadurch fällt das weg!

himitsu 6. Jun 2007 13:50

Re: Hash eines Bildes?
 
Tja, dann mußt du halt nach etwas (Kleinem) suchen, welches quasi eindeutig die Datei indentiviziert.

Oder du schaffst dir soewas.
Irgendwo (z.B. im Dateinamen oder irgendeiner Liste) einen wert speichern, welcher dat Bild und seinen Status repräsentiert ... und dann diesen Wert vergleichen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz