Delphi-PRAXiS
Seite 2 von 2     12   

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)

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 17:30 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