Autor Beitrag
knittel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71
Erhaltene Danke: 2

Win XP, Win7, openSUSE
Delphi 7
BeitragVerfasst: Sa 23.10.10 10:26 
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.

_________________
"Wir können nicht fliehen!" "Wieso nicht?" "Sie haben mir die Schnürsenkel zusammengebunden!" "Die Schweine."
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: 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.

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
knittel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71
Erhaltene Danke: 2

Win XP, Win7, openSUSE
Delphi 7
BeitragVerfasst: Sa 23.10.10 13:56 
user profile iconplatzwart hat folgendes geschrieben Zum zitierten Posting springen:
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?

_________________
"Wir können nicht fliehen!" "Wieso nicht?" "Sie haben mir die Schnürsenkel zusammengebunden!" "Die Schweine."
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: 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:

ausblenden 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]; // Scanline immer auf eine Zeile anwenden
  For x:=0 to bm.Width-1 do
   begin
    If(p[x] = ClWhite)then // lesender Zugriff auf x-ten Pixel in der Zeile y...
     p[x]:= ClRed; // ... und schreibender Zugriff
   end;
 end;

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
knittel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 71
Erhaltene Danke: 2

Win XP, Win7, openSUSE
Delphi 7
BeitragVerfasst: 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.

_________________
"Wir können nicht fliehen!" "Wieso nicht?" "Sie haben mir die Schnürsenkel zusammengebunden!" "Die Schweine."