Delphi-PRAXiS
Seite 2 von 2     12   

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 22. Dez 2005 15: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 16: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 18:54 Uhr.
Seite 2 von 2     12   

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