Re: Bilder vergleichen
versuchs mal mit
Delphi-Quellcode:
mfG
High(P^)
mirage228 |
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: |
Re: Bilder vergleichen
Also bei mir gehts.
Mein Test-Code:
Delphi-Quellcode:
Der Compiler hat jetzt nur auszusetzen gehabt, das P und P2 nicht intialisert waren. Sonst gabs keine Fehler.
var
P,P2 : PByteArray; i: integer; begin i := High(P^); CompareMem(P, P2, High(P^)); mfG mirage228 P.S.: TByteArray hat eine feste Länge von 32768 [0..32767] |
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 |
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:
Lanege hat fast immer den Wert von 32767... was ja eigentlich total ok ist...
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; *Ricane-der-alte-Thread-Ausgräber* |
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; |
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? |
Re: Bilder vergleichen
Hi Leute bei mir komm die Fehlermeldung "[Fehler] Unit1.pas(78): Undefinierter Bezeichner: 'Ceil'"
Code:
Delphi-Quellcode:
hab schon die ganze Zeit herumprobiert finde keine Lösung.
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; Danke für euere Anworten im Voraus godman |
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 ;) )
|
Re: Bilder vergleichen
ich muss zwei jpgs vergleichen?
welcher Code funzt nun? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:31 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