AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Bilder vergleichen -> optimiertes verfahren gesucht!
Thema durchsuchen
Ansicht
Themen-Optionen

Bilder vergleichen -> optimiertes verfahren gesucht!

Ein Thema von alleinherrscher · begonnen am 16. Jul 2005 · letzter Beitrag vom 18. Jul 2005
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#1

Bilder vergleichen -> optimiertes verfahren gesucht!

  Alt 16. Jul 2005, 18:54
Hi, hab dieses Forum schon durchsucht, allerdings keinen wirklich passenden Thread gefunden. Einfaches Problem: Ich lade zwei gleich große bilder in eine canvas, und vergleiche Sie. Der unterschied (nur das Rechteck zwischen kleinsten unterschiedlichem Punkt und größtem unterschiedlichen punkt) wird in bild3 gespeichert. Allerdings braucht mein Rechner dafür ca. 10 sekunden, was mir zu lange ist. Gibts ne möglichkeit, diesenm Code zu optimieren?

Delphi-Quellcode:
var
  c : TCanvas;
  r,r2 : TRect;
  Bild,Bild2,bild3 : TBitmap;
  x,y,x_min,y_min,x_max,y_max:integer;
begin
 x_min:=9999999;
 y_min:=9999999;
 x_max:=0;
 y_max:=0;

    Bild := TBitmap.Create;
    Bild2 :=TBitmap.Create;

    Bild.LoadFromFile('C:\windows\desktop\bild1.bmp');
    Bild2.LoadFromFile('C:\windows\desktop\bild2.bmp');

    for x:=1 to bild.width do
    for y:=1 to bild.height do
     begin
       if bild.Canvas.pixels[x,y]<>bild2.Canvas.pixels[x,y] then
       begin
       if x_min>x then x_min:=x;
       if x_max<x then x_max:=x;
       if y_min>y then y_min:=y;
       if y_max<y then y_max:=y;

       end;
     end;
    r := Rect(0, 0, x_max-x_min, y_max-y_min);
    r2:= rect(x_min,y_min,x_max,y_max);
    Bild3:=TBitmap.Create;
    bild3.Width:=x_max-x_min;
    bild3.height:=y_max-y_min;
    bild3.Canvas.CopyRect(r,bild2.canvas,r2);
    bild3.SaveToFile('C:\windows\desktop\bild3.bmp');
     showmessage('fertig');
  end;
Mit freundlichen Grüßen,

Alleinherrscher
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Benutzerbild von Ultimator
Ultimator

Registriert seit: 17. Feb 2004
Ort: Coburg
1.860 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Bilder vergleichen -> optimiertes verfahren gesucht!

  Alt 16. Jul 2005, 18:56
Der Canvas.Pixels-Zugriff ist enorm langsam, du solltest besser Hier im Forum suchenscanLine Delphi-Referenz durchsuchenScanLine verwenden.
Alternativ auch die Hier im Forum suchengr32-Library, die ist wesentlich schneller und überhaupt wurde dort viel optimiert im Gegensatz zu den Bitmap- und Image-Komponenten, die Delphi standardmäßig mitbringt

//Ach ja, Ressourcenschutzblöcke nicht vergessen, die Bitmaps wollen ja auch wieder freigegeben wreden
Julian J. Pracht
  Mit Zitat antworten Zitat
bigg
(Gast)

n/a Beiträge
 
#3

Re: Bilder vergleichen -> optimiertes verfahren gesucht!

  Alt 16. Jul 2005, 19:08


Beide Bilder müssen gleich sein?
Dann kontrolliere zunächst folgende Größen:

- Dateigröße
- Hohe und Breite
- Farbpalette

Sind diese gleich, kannst du die Dateien mit der Klasse "TFileStream" einlesen
und vergleichen.

Mit Scanline geht das natürlich auch, dies könnte jedoch bei größeren Dateien
zum Performance-Killer werden.
  Mit Zitat antworten Zitat
Benutzerbild von Jan
Jan

Registriert seit: 24. Sep 2002
Ort: Magdeburg
491 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Bilder vergleichen -> optimiertes verfahren gesucht!

  Alt 16. Jul 2005, 19:09
Nicht nur, das was vorher erwähnt wurde kannst du verbessern, sondern auch deinen Algo, der meiner Meinung nach ziemlich viel unnütze Berechnung anstellt.


Delphi-Quellcode:
var
  c : TCanvas;
  r,r2 : TRect;
  Bild,Bild2,bild3 : TBitmap;
  x,y,x_min,y_min,x_max,y_max:integer;
begin
x_min:=9999999;
y_min:=9999999;
x_max:=0;
y_max:=0;

    Bild := TBitmap.Create;
    Bild2 :=TBitmap.Create;

    Bild.LoadFromFile('C:\windows\desktop\bild1.bmp');
    Bild2.LoadFromFile('C:\windows\desktop\bild2.bmp');

    for x:=1 to bild.width do
    for y:=1 to bild.height do
     begin
       if bild.Canvas.pixels[x,y]<>bild2.Canvas.pixels[x,y] then
       begin
bis dahin war in Ordnung.
aber dann würde ich folgendes schreiben:


Delphi-Quellcode:
        x_min:=x;
        y_min:=y;
        break;
      end;
    end;
    for x:=bild.width downto 1 do
    for y:=bild.height downto 1 do
    begin
      if bild.Canvas.pixels[x,y]<>bild2.Canvas.pixels[x,y] then
      begin
        x_max:=x;
        y_max:=y;
        break;
      end;
    end;
    r2:= rect(x_min,y_min,x_max,y_max);
    Bild3:=TBitmap.Create;
    bild3.Width:=x_max-x_min;
    bild3.height:=y_max-y_min;
    bild3.Canvas.CopyRect(r,bild2.canvas,r2);
    bild3.SaveToFile('C:\windows\desktop\bild3.bmp');
    showmessage('fertig');
  end;
Probier das mal! Ist aber alles ungetestet und so ins textfester eingetippt, also keine Garantie.
Gruß
Jan
Wenn die Sonne der Kultur tief steht, werfen auch kleine Gestalten lange Schatten.
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Bilder vergleichen -> optimiertes verfahren gesucht!

  Alt 16. Jul 2005, 19:10
danke für die super schnelle antwort, werde jetzt die g32 lib testen! thx!!!!
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#6

Re: Bilder vergleichen -> optimiertes verfahren gesucht!

  Alt 16. Jul 2005, 19:15
Delphi-Quellcode:
for x:=1 to bild.width do
for y:=1 to bild.height do
Das sollte so aussehen:
Delphi-Quellcode:
for x := 0 to Bild.Width - 1 do
  for y := 0 to Bild.Height - 1 do
Außerdem darfst du nicht vergessen, die Bitmaps wieder freizugeben.

Ansonsten schließe ich mich Ultimator voll und ganz an.

@bigg:
Gute Idee, alleinherrscher will aber die Unterschiede auch abspeichern .
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
bigg
(Gast)

n/a Beiträge
 
#7

Re: Bilder vergleichen -> optimiertes verfahren gesucht!

  Alt 16. Jul 2005, 19:33
Zitat von Khabarakh:
@bigg:
Gute Idee, alleinherrscher will aber die Unterschiede auch abspeichern .
Und das ist deiner Meinung mit TFileStream nicht möglich, falsch!

@Autor:
Wenn du auf das Bild malst per Canvas, muss das Bild immer wieder neu gezeichnet werden
und das kostet Zeit.
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#8

Re: Bilder vergleichen -> optimiertes verfahren gesucht!

  Alt 16. Jul 2005, 20:55
Hi@all!

Also erstmal danke für die ganzen antworten!

@Jan: Ich verstehe nicht, warum deine Routine schneller gehen soll...du geht doch per pixels anweisung das ganzen Bild 2 mal durch, dadurch müsste es doch auch im endeffekt doppeltsolange dauern.

Ich benutzte nun die g32 lib. die funktion ist super, dauert inetwa noch so 3 sekunden, allerdings folgendes problem: Es wird nicht mehr der richtige bildausschnitt kopiert, weil aus einen mir unbekannten grund x_max und y_max nicht mehr korrekt erkannt werden (achtet auf meine kommentierung im Source Code!)

Delphi-Quellcode:
var
  r,r2 : TRect;
  Bild,Bild2,bild3 : TBitmap32;
  x,y,x_min,y_min,x_max,y_max:integer;
begin
 x_min:=9999999;
 y_min:=9999999;
 x_max:=0;
 y_max:=0;

    Bild := TBitmap32.Create;
    Bild2 :=TBitmap32.Create;
        Bild3:=TBitmap32.Create;
    Bild.LoadFromFile('C:\windows\desktop\bild1.bmp');
    Bild2.LoadFromFile('C:\windows\desktop\bild2.bmp');

    for x:=0 to bild.width-1 do
    for y:=0 to bild.height-1 do
     begin
       if bild[x,y] <> bild2[x,y] then
       begin

       if x_min>x then x_min:=x;
       if x_max<x then x_max:=x;
       if y_min>y then y_min:=y;
       if y_max<y then y_max:=y;

       end;
     end;
    showmessage(inttostr(x_min)+' '+inttostr(y_min)+' '+inttostr(x_max)+' '+inttostr(y_max));

    r := Rect(0, 0, x_max, y_max);
    r2:= rect(x_min,y_min,x_max-x_min,y_max-y_min);

    bild3.Width:=x_max-x_min;
    bild3.height:=y_max-y_min;
    bild2.drawto(bild3,r2,r); //hier das verstehe ich gar nicht, denn:
//wenn ich r und r2 vertausche, werden x_max und y_max wieder richtig
//erkannt. kann mir das jemand erklären?!? Ist das n fehler in der g32
//lib?



    bild3.SaveToFile('C:\windows\desktop\bild3.bmp');
     showmessage('fertig');
  end;
Ich will ja nicht nerven, aber kann mir da jemand helfen?
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#9

Re: Bilder vergleichen -> optimiertes verfahren gesucht!

  Alt 16. Jul 2005, 22:25
Zitat von bigg:
Zitat von Khabarakh:
@bigg:
Gute Idee, alleinherrscher will aber die Unterschiede auch abspeichern .
Und das ist deiner Meinung mit TFileStream nicht möglich, falsch!
Es ist sicher möglich, CopyRect/BlockTransfer für einen Stream nachzubauen, aber da nehme ich doch lieber die fertigen Lösungen .
Zitat von bigg:
@Autor:
Wenn du auf das Bild malst per Canvas, muss das Bild immer wieder neu gezeichnet werden
und das kostet Zeit.
Aber doch nicht bei einem Bitmap im Speicher.

@alleinherrscher:
Was meinst du mit "erkannt" ?
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#10

Re: Bilder vergleichen -> optimiertes verfahren gesucht!

  Alt 16. Jul 2005, 22:49
Folgendes: Ich habe einen Screenshot von meinem Desktop gemacht, abgespeichert als Bild1.bmp
Dann habe ich in dieses Bild mit Paint ein weißes rechteck "reingemalt" und das als Bild2.bmp abgespeichert.

Wenn ich die Delphi-routine benutzte, also mit bild.canvas.pixels[x,y] arbeite, um den unterschied zwischen beiden Bildern herauszufinden, so wird in Bild3.bmp genau mein manipuliertes weißes rechteck abgespeichert.
Benutzte ich aber bild[x,y] oder bild.pixel[x,y], also die g32 komponenten, so wird in Bild3 mehr gepspeichert, als das weiße rechteck. Man kann noch teile vom Desktop sehen. Ich habe dann in einer Messagebox die x_min...usw koordinaten angeben lassen. Mit g32 ergeben sich andere und daher auch leider falsche werte für x_min,x_max,y_min, und y_max, als mit der Delphi Funktion.

Ich frage mich, warum?!
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz