Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bilder vergleichen (https://www.delphipraxis.net/18034-bilder-vergleichen.html)

mirage228 8. Sep 2004 19:35

Re: Bilder vergleichen
 
versuchs mal mit

Delphi-Quellcode:
High(P^)
mfG
mirage228

Ricane 8. Sep 2004 19:41

Re: Bilder vergleichen
 
Mmhhhhh........ ne, funzt auch nicht..... Fehlermeldung hält sich beständig :gruebel:

EDIT: Sorry! Das mit dem High klappt..... war ein Fehler von mir :oops:

mirage228 8. Sep 2004 19:54

Re: Bilder vergleichen
 
Also bei mir gehts.

Mein Test-Code:
Delphi-Quellcode:
var
  P,P2 : PByteArray;
  i: integer;
begin
  i := High(P^);
  CompareMem(P, P2, High(P^));
Der Compiler hat jetzt nur auszusetzen gehabt, das P und P2 nicht intialisert waren. Sonst gabs keine Fehler.

mfG
mirage228

P.S.: TByteArray hat eine feste Länge von 32768 [0..32767]

himitsu 8. Sep 2004 19:55

Re: Bilder vergleichen
 
och menno, mußt du doch tatsächlich sowas altes ausgraben und dann auchnoch behaupten es ginge nicht :?

:coder2: Na dann werd' ich wohl mal nachgucken müssen

Ricane 8. Sep 2004 20:05

Re: Bilder vergleichen
 
Aber irgendwie krieg ich trotzdem immer eine Exception, das aus einem Bereich nicht gelesen werden kann...... hier mein Code ...

Der Fehler tritt bei dem CompareMem Befehl auf...

Delphi-Quellcode:
Var

  I, J, K, Laenge: Integer;
  Reihe: Array[1..2] Of PByteArray;
  Ungleich: Array[1..4] Of Boolean;
  [...]

Begin

    [...]

    For K := 1 To 4 Do
    Begin
      For J := 0 To AktBmp[K].Height - 1 Do
      Begin
        Reihe[1] := AktBmp[K].ScanLine[J];
        Reihe[2] := AltBmp[K].ScanLine[J];
        Laenge := High(Reihe[2]^);
        If CompareMem(Reihe[1], Reihe[2], Laenge) = False Then
          Ungleich[K] := True;
        If Ungleich[K] = True Then Break;
      End;
    End

    [...]

End;
Lanege hat fast immer den Wert von 32767... was ja eigentlich total ok ist...


*Ricane-der-alte-Thread-Ausgräber*

himitsu 8. Sep 2004 20:31

Re: Bilder vergleichen
 
Also PByteArray ist ein Zeiger auf TByteArray und TByteArray ist als "Array[0..32767] of Byte" definiert.
Length(P) hätte eh nicht funktioniert, da P ein Pointer ist und immer 4 Byte (derzeit) ist

So, das mit CompareMem läuft jetzt:
Delphi-Quellcode:
Procedure TForm1.Button1Click(Sender: TObject);
  Var i, R, W, L, X: Integer;
    BitMap, BitMap2: TBitMap;

  Begin
    BitMap := TBitMap.create;
    BitMap2 := TBitMap.create;
    BitMap.LoadFromFile('vorlage.bmp');    //Laden der ausgangsdatei
    BitMap2.LoadFromFile('screenshot.bmp'); //Laden der vergleichsdatei
    If BitMap.PixelFormat <> BitMap2.PixelFormat Then
      Label1.Caption := 'unterschiedliches Pixelformat'
    Else If (BitMap.Width <> BitMap2.Width) and (BitMap.Height <> BitMap2.Height) Then
      Label1.Caption := 'unterschiedliche Bildgröße'
    Else Begin
      R := 0; W := 0;
      Case BitMap.PixelFormat of
        pf1bit: L := Ceil(BitMap.Width / 8);
        pf4bit: L := Ceil(BitMap.Width / 2);
        pf8bit: L := BitMap.Width;
        pf15bit: L := Ceil(BitMap.Width * 15 / 8); {ich hoffe mal das für die 15 Bit stimmt}
        pf16bit: L := BitMap.Width * 2;
        pf24bit: L := BitMap.Width * 3;
        pf32bit: L := BitMap.Width * 4;
      End;
      For i := 0 to BitMap.Height - 1 do
        If CompareMem(BitMap.ScanLine[i], BitMap2.ScanLine[i], L) Then Inc(R) Else Inc(W);
      Label1.Caption := IntToStr(R) + ' gleiche und ' + IntToStr(W) + ' unterschiedliche Zeilen';
    End;
  End;

xineohp 5. Feb 2005 21:40

Re: Bilder vergleichen
 
*ausgrab*

und was muss ich machen, wenn das PixelFormat meines Bitmaps auf pfDevice steht? Kann ich den Code dahingehend erweitern, oder soll ich einfach das Pixelformat meiner Bitmaps verändern (da ich sie selber erstelle, sollte das kein Problem sein) und wenn ja, was soll ich für ein Pixelformat verwenden?

godman 27. Nov 2005 19:22

Re: Bilder vergleichen
 
Hi Leute bei mir komm die Fehlermeldung "[Fehler] Unit1.pas(78): Undefinierter Bezeichner: 'Ceil'"

Code:

Delphi-Quellcode:
procedure vergleichenb;
var
    b1, b2: TBitmap;
  c1, c2: PByte;
  x, y, i,
  different: Integer; // Counter for different pixels
  Var R, W, L: Integer;
  begin
  b1 := Form1.Image1.Picture.Bitmap;
  b2 := Form1.spielerk.Picture.Bitmap;
  If b1.PixelFormat <> b2.PixelFormat Then
      Form1.Label1.Caption := 'unterschiedliches Pixelformat'
    Else If (b1.Width <> b1.Width) and (b2.Height <> b2.Height) Then
      Form1.Label1.Caption := 'unterschiedliche Bildgröße'
    Else Begin
      R := 0; W := 0;
      Case b1.PixelFormat of
        pf1bit: L := Ceil(b1.Width / 8);
        pf4bit: L := Ceil(b1.Width / 2);
        pf8bit: L := b1.Width;
        pf15bit: L := Ceil(b1.Width * 15 / 8); {ich hoffe mal das für die 15 Bit stimmt}
        pf16bit: L := b1.Width * 2;
        pf24bit: L := b1.Width * 3;
        pf32bit: L := b1.Width * 4;
      rnd;
      For i := 0 to b1.Height - 1 do
        If CompareMem(b1.ScanLine[i], b2.ScanLine[i], L) Then Inc(R) Else Inc(W);
      Form1.Label1.Caption := IntToStr(R) + ' gleiche und ' + IntToStr(W) + ' unterschiedliche Zeilen';
    end;
end;
hab schon die ganze Zeit herumprobiert finde keine Lösung.

Danke für euere Anworten im Voraus

godman

turboPASCAL 27. Nov 2005 22:47

Re: Bilder vergleichen
 
Habe zwar keine Lösung für dein Problem, aber du kannst mal hier (Bitmap Compare) sachauen. Diese Lösung ist zwar einfach aber gut und mit Features. ( Werbung ;) )

marlem 26. Apr 2006 15:02

Re: Bilder vergleichen
 
ich muss zwei jpgs vergleichen?
welcher Code funzt nun?


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:31 Uhr.
Seite 2 von 4     12 34      

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