Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi 2 TImages mit einander vergleichen (https://www.delphipraxis.net/95297-2-timages-mit-einander-vergleichen.html)

Mikro 4. Jul 2007 20:19


2 TImages mit einander vergleichen
 
Hi,

wenn 2 ausgewählte Imgaes gleich sind, soll etwas passieren. Ich hab mir das zusammengedacht:
Delphi-Quellcode:
if image1.picture=image3.picture then edit1.text:=inttostr(strtoint(edit1.text)+ 1);
das funktioniert aber nicht, zeigt mir immer ne 0 (Startwert) im edit-Feld an.

Wie funktioniert das ganze bei TRichEdit, da klappt es bei mir auch nicht... BItte um Hilfe!!!

DeddyH 4. Jul 2007 20:23

Re: 2 TImages mit einander vergleichen
 
Zitat:

Zitat von Mikro
if image1.picture=image3.picture

Du vergleichst hier Referenzen auf Objekte. Um die Grafiken an sich miteinander zu vergleichen, wirst Du um einen Pixelvergleich nicht herumkommen.

Mikro 4. Jul 2007 20:34

Re: 2 TImages mit einander vergleichen
 
Kann ich nicht einfach den Pfad vergleichen, denn der ist von mir festgegeben. Ist gibt 4 verschiedene Bilder, d.h. 4 verschiedene, aber fest vergebene Dateipfade, wenn ein Dateipfad mit dem gesuchten übereinstimmt, soll was passieren, das geht nicht??
Wie kann ich sonst prüfen, ob das Bild das Gleiche ist, wenn ich weiß, dass es nur eins von 4 sein kann???

DeddyH 4. Jul 2007 20:37

Re: 2 TImages mit einander vergleichen
 
Lädts Du die Bilder mit LoadFromFile? Dann merk Dir doch einfach den Pfad je Image.

Apollonius 4. Jul 2007 20:41

Re: 2 TImages mit einander vergleichen
 
Der Bildpfad wird norgendwo gespeichert, entweder machst du das selbst oder diese Möglichkeit funktioniert nicht. Du könntest versuchen,. bei den Bildern z.B. die linken oberen Pixel miteinander zu vergleichen. Das geht so:
Delphi-Quellcode:
if image1.canvas.pixels[0,0]=image2.canvas.pixels[0,0] then
edit: Fehler korrigiert

DeddyH 4. Jul 2007 20:42

Re: 2 TImages mit einander vergleichen
 
@Apollonius: Das ist jetzt nicht Dein Ernst, oder? Dann würden ja alle Grafiken matchen, die zufällig in der linken oberen Ecke die gleiche Farbe haben.

Mikro 4. Jul 2007 20:50

Re: 2 TImages mit einander vergleichen
 
nur ein Pixel zu vergleichen würde nicht klappen, die Bilder haben sehr ähnliche Hintergründe...

Ich weiße die Bilder schon vorher zu, also nicht über LoadFromFile, irgendwo muss doch der Pfad von dem Bild hinterlegt sein. Denn wenn ich nen leeres TImage (Image2) nehme und schreibe:
Delphi-Quellcode:
image2.picture:=image1.picture
nimmt das das Bild des ersten Image an. Also muss das auch wissen, was es drin hat ;-)

bye

DeddyH 4. Jul 2007 20:52

Re: 2 TImages mit einander vergleichen
 
Zitat:

Zitat von Mikro
Ich weiße die Bilder schon vorher zu

Und wie?

Mikro 4. Jul 2007 20:54

Re: 2 TImages mit einander vergleichen
 
doppelt auf TImage klicken, dann auf Laden, Pfad wählen, ok... :-D Eben vor dem compilieren...

DeddyH 4. Jul 2007 20:59

Re: 2 TImages mit einander vergleichen
 
Dann hast Du die Bilder fest in den Ressourcen. Nimm doch eine TImageList, lade Deine 4 Bilder da hinein und weise den Images die Grafiken zur Laufzeit zu.

Apollonius 4. Jul 2007 21:10

Re: 2 TImages mit einander vergleichen
 
Zitat:

Zitat von DeddyH
@Apollonius: Das ist jetzt nicht Dein Ernst, oder? Dann würden ja alle Grafiken matchen, die zufällig in der linken oberen Ecke die gleiche Farbe haben.

Wenn es aber nur vier Grafiken sind, dann sucht man sich eben ein relevantes Pixel aus.

Mikro 4. Jul 2007 21:17

Re: 2 TImages mit einander vergleichen
 
Wollte das mit dem Pixel vergleichen mal versuchen, aber der gibt mir nach deinem Code eine Fehlermeldung raus:
UNdefinierter Bezeichner "Canvas", was ich aber absolut nicht verstehe.

Apollonius 4. Jul 2007 21:20

Re: 2 TImages mit einander vergleichen
 
Ups, schande über mich! Mach entweder image1.canvas oder image1.picture.bitmap.canvas draus. Das mit dem Canvas funktioniert übrigens nur, falls du .bmp-Daten verwendest.

Mikro 4. Jul 2007 21:21

Re: 2 TImages mit einander vergleichen
 
hab ich leider nicht, hab jpg... Muss ich eben fudeln, oder fällt jmd noch was anderes ein?

DeddyH 4. Jul 2007 21:38

Re: 2 TImages mit einander vergleichen
 
Hab da schnell mal was geschrieben.
Delphi-Quellcode:
function GleicheBilder(gr1,gr2: TGraphic): Boolean;
var i, j: integer;
    P1,P2: PByteArray;
    bm1,bm2: TBitmap;
begin
  Result := false;
  bm1 := TBitmap.Create;
  bm2 := TBitmap.Create;
  try
    bm1.Assign(gr1);
    bm2.Assign(gr2);
    if (bm1.Height <> bm2.Height) or (bm1.Width <> bm2.Width) then exit;
    for i := 0 to bm1.Height - 1 do
      begin
        P1 := bm1.ScanLine[i];
        P2 := bm2.ScanLine[i];
        for j := 0 to bm1.Width - 1 do
          if P1^[j] <> P2^[j] then exit;
      end;
    Result := true;
  finally
    FreeAndNil(bm1);
    FreeAndNil(bm2);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if GleicheBilder(Image1.Picture.Graphic,Image2.Picture.Graphic) then
    showmessage('Gleich')
  else
    ShowMessage('Nicht gleich');
end;

Mikro 4. Jul 2007 21:54

Re: 2 TImages mit einander vergleichen
 
Zitat:

Zitat von DeddyH
Hab da schnell mal was geschrieben.

Haha, du bist gut... Danke aber... Hab mir da auch jetzt was zusammengebastelt... Aber deins ist auf jedenfall eleganter... :-) und grad mal geschrieben :-D

Ultimator 4. Jul 2007 22:07

Re: 2 TImages mit einander vergleichen
 
Bei JPEG-Dateien könntest du da unter Umständen Pech haben. Du vergleichst die Piyel auf 100%-ige Gleichheit. Da JPEG aber vrelustbehaftet komprimiert, kanns sein, dass die Farben um vielleicht 1 RGB-Wert verschieden sind, sie aber als ungleich erkannt werden. Du solltest eine Toleranz einbauen, mit der du die Bilder vergleichst.

MfG Ultimator

bitsetter 4. Jul 2007 23:15

Re: 2 TImages mit einander vergleichen
 
Zitat:

Zitat von DeddyH
Hab da schnell mal was geschrieben.
Delphi-Quellcode:
function GleicheBilder(gr1,gr2: TGraphic): Boolean;
var i, j: integer;
    P1,P2: PByteArray;
    bm1,bm2: TBitmap;
begin
  Result := false;
  bm1 := TBitmap.Create;
  bm2 := TBitmap.Create;
  try
    bm1.Assign(gr1);
    bm2.Assign(gr2);
    if (bm1.Height <> bm2.Height) or (bm1.Width <> bm2.Width) then exit;
    for i := 0 to bm1.Height - 1 do
      begin
        P1 := bm1.ScanLine[i];
        P2 := bm2.ScanLine[i];
        for j := 0 to bm1.Width - 1 do//<--
          if P1^[j] <> P2^[j] then exit;
      end;
    Result := true;
  finally
    FreeAndNil(bm1);
    FreeAndNil(bm2);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if GleicheBilder(Image1.Picture.Graphic,Image2.Picture.Graphic) then
    showmessage('Gleich')
  else
    ShowMessage('Nicht gleich');
end;

Hallo.

müsste nicht anstatt
Delphi-Quellcode:
for j := 0 to bm1.Width - 1 do
Delphi-Quellcode:
for j := 0 to (bm1.Width * 3) -1 do
zumindest bei 24 Bit Bildern stehen?

Delphi-Quellcode:
if not CompareMem(bm1.ScanLine[i], bm2.ScanLine[i], bm1.Width * 3) then
        exit;
hätte wohl auch gereicht.

DeddyH 5. Jul 2007 08:15

Re: 2 TImages mit einander vergleichen
 
Hallo,

das kann der Threadersteller ja dann noch einbauen. Ich hab das nur schnell runtergetippt, dass es da Optimierungsmöglichkeiten gibt, ist mir klar :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 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