Autor Beitrag
MadCyborg
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 04.10.05 13:32 
ich habe zwei bitmaps, die ich gerne vergleichen möchte. zum testen habe ich mit zwei fast komplett identische mit paint(dem von windows) erstellt. sie haben einen einfarbigen hintergrund, eine linie, und einen kreis darauf. der unterschied ist lediglich ein einziger pixel, undzwar der ganz oben links. wenn ich mein programm unterschiedliche pixel suchen lasse, sagt es mir aber es gibt zwei. ich habe dann noch ein testbitmap gemacht, mit einer 61 pixel langen linie ( von (o;o) bis 0;60), wenn ich mein programm darauf anwende, kriege ich 122 als ergebnis. --> zweimal so viel.

hat einer ne idee dazu, oder mache ich grundlegend irgendwas falsch?

x1, y1 und unterschiede sind integer, c1 und c2 sind PByteArray.

sollte mehr code von nöten sein, stelle ich den garne dazu... wäre schön wenn mir einer helfen kann.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
for y1:=0 to image1.Height - 1 do
begin //yschleife

  c1:=image1.picture.Bitmap.scanline[y1];
  c2:=image2.picture.Bitmap.scanline[y1];

  for x1:=0 to image1.Width - 1 do
     begin //xschleife

        if (c1[x1]<>c2[x1]) then
        begin

        unterschiede:=unterschiede+1;
           
        end
       

     end;//xschleife
end;//yschleife
lbl_unterschiede.caption:=inttostr(unterschiede);
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Di 04.10.05 13:43 
Haben deine Bilder 8 Bit Farbtiefe? Wenn nein (wovon ich mal ausgehe) wirst du mit einem pByteArray nicht weit kommen. Das Problem ist, dass du das Bild Byteweise und nicht Pixelweise untersuchst. Bei 24 Bit Bildern besitzt ein Pixel 3 Bytes. Blau, Grün und Rot. Bewusst so herum aufgezählt, weil sie so abgespeichert sind. Wenn du jetzt ein Pixel Rot anstelle von Grün hast, dann sind 2 Bytes unterschiedlich. Obwohl sie zu ein und dem selbe Pixel gehören. Bei 24 Bit musst du entsprechend 3 Bytes am Stück anstelle von einem Überprüfen. Bei 16 nur 2 Bytes. Bei 8 nur eines. Und bei 4 sogar nur jedes halbe Byte, da sich Pixel ein Byte teilen.

Abhelfen kannst du dies indem du das Pixelformat der Bitmaps auf pf24Bit stellst und dann immer 3 Bytes am Stück vergleichst. Du vergrößerst den Speicherverbrauch zwar zwischenzeitlich etwas aber so kannst du dir 20 verschieden Arten der Vergleiche ersparen.

Je nachdem was dir lieber ist kannst du das PixelFormat auch auf pf32Bit stellen. Dann sind 4 Bytes (Cardinal, DWord) genau ein Pixel. Das macht sich beim Vergleichen mitunter wesentlich einfacher. Und wahrscheinlich auch schneller.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
MadCyborg Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Di 04.10.05 13:55 
gut. ich denke ich verstehe worauf du hinauswillst.
ich habe gerade mal die farbtiefe der bitmaps auf pf8bit festgelegt, und c1/c2 als PBytearray gelassen, so macht das programm exakt das was es soll.
ich werde mich dann mal daran machen, das es da auch mit der ursprüngliche farbtiefe tut.
thx schonmal für eine antwort.