Entwickler-Ecke
Multimedia / Grafik - Bild Informationen auslesen
knittel - Sa 23.10.10 10:26
Titel: Bild Informationen auslesen
Hallo allerseits,
Ich will relativ einfach aber vorallem schnell überprüfen ob sich innerhalb eines bestimmten Rechtsecks auf einem Schwarzweis bild ein schwarzer Pixel befindet. Ich könnte logischerweise 2 for-schleifen machen die jeden einzelnen Pixel überprüfen und sobald ein schwarzer pixel gefunden wurde die schleifen verlassen. Aber trotzdem scheint mir das irgendwie ineffektiv. Ich will nur wissen ob es einen intelligenteren Weg dafür gibt.
Danke im voraus.
jaenicke - Sa 23.10.10 10:55
Nun, da ließe sich vielleicht noch mit Assembler via repne scasd etwas optimieren (wobei das auch nicht so unbedingt schnell ist, jedenfalls im Vergleich mit MMX Instruktionen), aber an einem Vergleich der einzelnen Werte geht kein Weg vorbei.
Mit Scanline und einem Vergleich aller drei Farbwerte gleichzeitig sollte das aber auch ziemlich schnell gehen. Wie das mit einem Schwarzweiß-Bild ist, habe ich noch nie ausprobiert.
Nur der echte pixelweise Zugriff via Pixels ist natürlich extrem langsam.
platzwart - Sa 23.10.10 13:48
Mach das ganze mit einem TBitmap32 aus den Graphics32 und Scanline. Damit wirst du extrem schnell die zwei For-Schleifen abarbeiten können. Ich habe bei einem Bild das gleiche gemacht: ca. 4000 x 3000 Pixel, benötigte Zeit: wenige Millisekunden.
knittel - Sa 23.10.10 13:56
platzwart hat folgendes geschrieben : |
Mach das ganze mit einem TBitmap32 aus den Graphics32 und Scanline. Damit wirst du extrem schnell die zwei For-Schleifen abarbeiten können. Ich habe bei einem Bild das gleiche gemacht: ca. 4000 x 3000 Pixel, benötigte Zeit: wenige Millisekunden. |
^^ Also das wäre aufjeden Fall schnell genug die Fläche die ich überprüfe ist gerademal so um 32x32 (mehr oder weniger). Ich schau mir jetzt mal an wie ScanLine funktioniert.
Danke auf jeden Fall schonmal. :)
EDIT: Hab mich mal umgeguckt. Zum Thema TBitMap32 und ScanLine finde ich relativ wenig.
Könntest du dann noch kurz erklären wie ich mit ScanLine arbeite?
platzwart - Sa 23.10.10 14:16
Bei so kleiner Grafik machst du das besser mit normalem TBitmap und Pixelzugriff...
Falls du dennoch mit Scanline ausprobieren willst:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var p: PIntegerArray; bm: TBitmap;
[...]
For y:=0 to bm.Height-1 do begin p:= b.ScanLine[I]; For x:=0 to bm.Width-1 do begin If(p[x] = ClWhite)then p[x]:= ClRed; end; end; |
knittel - So 24.10.10 09:28
Ok. Vielen Dank, ich werds gleich mal mit ScanLine ausprobieren. Das Programm soll nämlich auf jeden Fall schnell ablaufen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!