![]() |
Pixels vs. Scanline. Seltsames Ergebnis...
Hi @ all.
Bin an nem Programm welches Bilder vergleicht. In sehr vielen Thread´s und Post´s wird erwähnt das die Scanline Methode sehr viel schneller sei als die Pixels[x,y] Methode. Allerdings habe ich ein erstaunliches Ergebnis. Hier die Zeiten für den Vergleich von: Bildergröße: 160*120 Pixel = 19600 Pixel Zitat:
Delphi-Quellcode:
Wisst ihr wieso das so ist???
//Scanline
procedure CompareImagesWithScanline(Image1,Image2:TBitmap); var line1,line2 : PByteArray; x,y : integer; differents : integer; const max = 3; begin Zeit1 := GetTickCount; differents := 0; for y := 0 to Image1.Height -1 do begin line1 := Image1.ScanLine[y]; line2 := Image2.ScanLine[y]; for x := 0 to Image1.Width -1 do if abs(line1[x]-line2[x]) > max then inc(differents); end; Zeit2 := GetTickCount; Form1.ListBox1.Items.Add(IntToStr(Zeit2-Zeit1)); Form1.ListBox2.Items.Add(IntToStr(differents)); end; //Pixels procedure CompareImagesWithPixels(Image1,Image2:TBitmap); var x,y: integer; Pixel1, Pixel2: Byte; differents: integer; const max = 3; begin Zeit1 := GetTickCount; differents := 0; for y := 0 to Image1.Height -1 do for x := 0 to Image1.Width -1 do begin Pixel1 := Image1.Canvas.Pixels[x,y]; Pixel2 := Image2.Canvas.Pixels[x,y]; if abs(Pixel2-Pixel1) > max then inc(differents); end; Zeit2 := GetTickCount; Form1.ListBox1.Items.Add(IntToStr(Zeit2-Zeit1)); Form1.ListBox2.Items.Add(IntToStr(differents)) end; Bin jetzt vollkommen verwirrt. Mfg Flips |
Re: Pixels vs. Scanline. Seltsames Ergebnis...
weil du schwachsinn machst
puxels gibt nen TColor = integer zurück, das müsstest du noch mit GetRValue (G/B) auflösen um so den unterschied festzustellen ausserdem muss man bei nem scanline noch pf24bit einstellen um dann bytesweise immer die farben zu bekommen: schau mal nach Trgbtriple oder prgbarray, und images per VAR param übergeben, dann kannste auch geich vergessen wenn dud as alles gemacht hast scanline mit Gettickocunt zu messen, dann wirst wohl Querperformancecounter brauchen dem kleinem bild |
Re: Pixels vs. Scanline. Seltsames Ergebnis...
hai, bei dir MUSS scanline natürlich langsamer sein, da du in einer for-schleife die Zeilen einlieset und dann ein einer weiteren for-schleife die Pixel vergleichst. Im unteren Verfahren hast du ach 2 for-schleifen, also verwendest du praktisch bei beiden Funktionen die selbe Technik, nur wenn du zuerst über scanline noch den Speicher kopierst und dann erst überprüfst, kann er ja gar nicht schneller sein, da du einfach den selben code nur um ein paar ecken weiter verwendest.
@brechi: 2 colors kann man auch vergleichen ohne sie zuerst aufzuteilen. du teilst 2 integerwerte ja auch nicht zuerst in ihre 4 Bytes auf und vergleichst die dann extra :gruebel: [edit]du hast doch recht :oops: ich dachte es geht nur darum ob die dinger gleich sind | aaaaber bei der scanline-methode muss man ja den selben Unterschied auch machen.[/edit] |
Re: Pixels vs. Scanline. Seltsames Ergebnis...
dumm gefragt:
und wie bekomm ich die ganze Geschwindigkeit rausgekitzelt? ps: der rohbau is von ![]() |
Re: Pixels vs. Scanline. Seltsames Ergebnis...
Hallo,
Zitat:
Ich hab das übrigens mal bei mir ausprobiert. Bei einem kleinen Bild (650x430 Pixel) dauert Scanline Null, Pixels ca. 500 Ticks. Gruß xaromz |
Re: Pixels vs. Scanline. Seltsames Ergebnis...
Zitat:
(Bin heute ned gut im Kopf, bin extrem müde :pale: ) [edit]Achso, du meinst von hinten anfangen oder wie? :gruebel: [/edit] |
Re: Pixels vs. Scanline. Seltsames Ergebnis...
Hallo,
Zitat:
Delphi-Quellcode:
Damit füllst Du ein Bitmap mit Zufallsfarben. Dabei ist das Bitmap allerdings 8 Bit. Bei 24 Bit wird's schwieriger: Eine Zeile ist immer an einer Integer-Grenze ausgerichtet. Deshalb muss man z. B. bei einem 13 Pixel breiten Bild bei jeder Zeile 3 Byte addieren. Das geht dann so:
var
P: PByteArray; C: Integer; begin P := Bitmap1.ScanLine[Bitmap1.Height - 1]; for C := 0 to Bitmap1.Width * Bitmap1.Height - 1 do P[C] := Random(255); end;
Delphi-Quellcode:
Gruß
var
P: PByteArray; C: Integer; Filler: Byte; begin P := Bitmap1.ScanLine[Bitmap1.Height - 1]; Filler := 4 - (Bitmap.Width mod 4); for C := 0 to ((Bitmap1.Width + Filler) * Bitmap1.Height) * 3 - 1 do P[C] := Random(255); end; xaromz |
Re: Pixels vs. Scanline. Seltsames Ergebnis...
genau, man kann mit einer Scanline das ganze Bild durchgehen, davon holt man sich das Scanline der letzten Zeile. Wenn du über das Ende dieser Zeile hinaus gehst (liest/schreibst) kommst du automatisch in die Zeile darüber etc.
|
Re: Pixels vs. Scanline. Seltsames Ergebnis...
d.h. das ich nur eine Schleife brauche?
|
Re: Pixels vs. Scanline. Seltsames Ergebnis...
Hallo,
Zitat:
gruß xaromz |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:02 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