Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Nur prüfen ob Bilder unterschiedlich sind (https://www.delphipraxis.net/59365-nur-pruefen-ob-bilder-unterschiedlich-sind.html)

meisteralex 21. Dez 2005 11:46


Nur prüfen ob Bilder unterschiedlich sind
 
Ist wahrschienlich bei meinem letzten Thread ein wenig Untergegangen
Ich denke da gibts bestimmt ne ganze einfache Lösung:
Also es geht darum zu prüfen ob 2 Bitmaps unterschiedlich sind.
Nich wo, nicht wie sondern einfach nur ob und dass sehr schnell (müsste so schnell sein wie bitblt).
Daher wollte ich fragen ob es sowas wie nen Binärvergleich von 2 Bitmaps gibt??
Also dasss man irgend wie einfach sagen kann if (bit1 = bit2) then ....
Wollte jetzt nicht mit scanline anfangen, da das zwar schnell ist, jedoch nicht an die Schnelligkeit von BitBlt rankommt, welche ich benötige!

dahead 21. Dez 2005 11:50

Re: Nur prüfen ob Bilder unterschiedlich sind
 
sind die bitmaps auf der festplatte gespeichert oder nur im arbeitsspeicher?

wenn auf platte, könntest du ja via md5 oder crc32 prüfen ob die dateien unterschiedlich sind (ganz primitv -> FileSize).
Edit: Hagen hat dazu mal was verfasst.

meisteralex 21. Dez 2005 12:05

Re: Nur prüfen ob Bilder unterschiedlich sind
 
ne sie liegen als tbitmap objekte im speicher
es muss doch irgendnen simplen befehl geben um 2 objekte im speicher zu vergleich, oder ?

Khabarakh 21. Dez 2005 13:27

Re: Nur prüfen ob Bilder unterschiedlich sind
 
Delphi-Referenz durchsuchenCompareMem
Hol dir per Scanline jeweils den Pointer auf die Pixeldaten und vergleiche sie miteinander.

meisteralex 21. Dez 2005 13:50

Re: Nur prüfen ob Bilder unterschiedlich sind
 
mmm, gibt mir scanline nicht nur immer eine zeile zurück ??

ichbins 21. Dez 2005 13:54

Re: Nur prüfen ob Bilder unterschiedlich sind
 
Khabarakh meine eine For-Schleife in der du scanline anwendest.

Oxmyx 21. Dez 2005 13:56

Re: Nur prüfen ob Bilder unterschiedlich sind
 
Du brauchst doch nur einen Zeiger auf die Bilddaten, und das gibt dir Scanline zurück. Dann kannst du ja mit CompareMem schauen, ob der Speicher an dieser Stelle identisch ist.

Khabarakh 21. Dez 2005 14:02

Re: Nur prüfen ob Bilder unterschiedlich sind
 
Zitat:

Zitat von ichbins
Khabarakh meine eine For-Schleife in der du scanline anwendest.

Eigentlich nicht :stupid: .
Ich bin mir nicht sicher (schon lange nicht mehr damit gearbeitet, wozu gibt es GR32 :mrgreen: ?), aber ein Pointer auf die letzte Zeile sollte der Anfang der Daten sein, also
Delphi-Quellcode:
Scanline[n] + Width * SizeOf(TRGBQuad) = Scanline[n-1]

meisteralex 21. Dez 2005 15:02

Re: Nur prüfen ob Bilder unterschiedlich sind
 
kannst du mir mal beispielcode geben, wie ich das jetzt genau vergleich ?

Cicaro 22. Dez 2005 11:01

Re: Nur prüfen ob Bilder unterschiedlich sind
 
@meisteralex:
Du solltest auch überlegen, wenn du das Programm schreibst, wie wahrscheinlich es ist, dass deine zwei Bilder gleich sind.
Wenn es ziemlich unwahrscheinlich ist, dann würde ich wie schon vorgeschlagen mit ScanLine arbeiten und statt for-Schleifen while- oder repeat-Schleifen nehmen, damit du sofort bei einem Ungleichen Pixel aus der Funktion aussteigen kannst. Möglicherweise geht es bei for-Schleifen auch, aber ich würde dir diesen Ausstieg empfehlen einzubauen (für die Ausführungsgeschwindigkeit).

meisteralex 22. Dez 2005 16:00

Re: Nur prüfen ob Bilder unterschiedlich sind
 
hab das ganze nochmal nachgeproggt und festgestellt, dass die scanline-methode doch rasent schnell ist, wenn man nur die rgb-quads vergleicht.

also wenn ich den code weglasse, der einen gleichen pixel makiert (mit einem definiertem farbton versieht) brauch mein programm nur ca 10-20 ms anstatt 200 ms . kann das sein das das soviel zeit kostet oder hab ich mich verproggt *g*

hier mein code:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
bitm1,bitm2:tbitmap;
start,ende,x,y,i,countfalsepixel:integer;
p,p2:PRGBQuad;
begin
bitm1 := tbitmap.Create;
bitm2 := tbitmap.Create;

bitm1.LoadFromFile('C:\bild1.bmp');
bitm2.LoadFromFile('C:\bild2.bmp');
 bitm1.PixelFormat := pf32bit;
 bitm2.PixelFormat := pf32bit;


start:= gettickcount;
for i:=1 to 1000 do
countfalsepixel:=0;
begin

for y := 0 to bitm1.Height - 1 do
  begin

    P := bitm1.ScanLine[y];
    P2 := bitm2.ScanLine[y];

  for x := 0 to bitm1.Width - 1 do
    begin

      if RGB(P^.rgbRed, P^.rgbGreen, P^.rgbBlue) <> RGB(P2^.rgbRed, P2^.rgbGreen, P2^.rgbBlue) then Inc(CountFalsePixel);

      Inc(P);
      Inc(P2);

    end;


  end;
end;

 ende := gettickcount;
bitm1.Free;
bitm2.Free;


  showmessage('falsche pixel:'+inttostr(countfalsepixel)+' in ms:'+inttostr(ende-start));
end;

Chrissi91 22. Dez 2005 17:13

Re: Nur prüfen ob Bilder unterschiedlich sind
 
Hm,

ich würde es anders machen. Ich hoffe ich erzähle keinen Mist :lol:

Also. Mit Blockread kann man (so weit ich weiß) alle Dateitypen einlesen. Somit auch Bilder. Das würde in etwa so aussehen:

Delphi-Quellcode:
var
 datei1,datei2: file;
 NumRead1, NumRead2: Integer;
 Buf1, Buf2: byte;
 aufhoeren: boolean;
begin
 aufhoeren:=false;
 AssignFile(datei1,'Pfad1');
 Reset(datei1, 1);
 AssignFile(datei2,'Pfad2');
 Reset(datei2, 1);
  repeat
   BlockRead(datei1, Buf1, SizeOf(Buf1), NumRead1);
   BlockRead(datei2, Buf2, SizeOf(Buf2), NumRead2);
    if Buf1<>Buf2 then
     begin
      aufhoeren:=true; //ganze Prozedure abbrechen
     end;
  until eof(datei1) or eof(datei2) or (aufhoeren=true);
 closefile(datei1);
 closefile(datei2);
end;
Der ganze Code ist ungetestet. Mit blockread wird jedes Byte eingelesen und verglichen. Wenn der 1. Unterschied auftritt, wird alles abgebrochen, da es sonst unsinnig wäre, weiter zu suchen.

Ich hoffe mal, alles was ich erzählt habe ist wahr :-D.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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 by Thomas Breitkreuz