ich dachte eben meine Software ist abgestürzt...

Habe dann festgestellt, das meine vermutlich völlig falsche Vorgehensweise für mein Problem daran schuld ist.
Was will ich machen ?
Ich möchte in einer Paintbox feststellen wo sich der erste Pixel ungleich weiss befindet.
und zwar von links , von rechts, von oben und von unten. Im Prinzip suche ein umschließendes Rechteck meiner dargestellten Grafik.
Dazu meine Funktionen:
Code: Alles auswählen
{------------------------------------------------------------------------------}
{ sucht von links an den ersten Pixel ungleich weiss }
{ liefert 0.. width-1 zurück wenn Pixel gefunden wurde }
{ liefert -1 zurück wenn kein Pixel gefunden wurde }
function FindLeft(canvas:TCanvas):Integer;
var x,y,width,height:Integer;
begin
width :=canvas.ClipRect.Right;
height:=canvas.ClipRect.Bottom;
for x:=0 to width-1 do begin { horizontal von links nach rechts suchen }
result:=x;
for y:=0 to height-1 do begin { vertikal von oben nach unten suchen }
if canvas.Pixels[x,y]<>clWhite then exit; { Pixel gefunden, dann Ende }
end;
end;
result:=-1; { result = -1 wenn keinen Pixel gefunden }
end;
{------------------------------------------------------------------------------}
{ sucht von rechts an den ersten Pixel ungleich weiss }
{ liefert 0.. width-1 zurück wenn Pixel gefunden wurde }
{ liefert -1 zurück wenn kein Pixel gefunden wurde }
function FindRight(canvas:TCanvas):Integer;
var x,y,width,height:Integer;
begin
width :=canvas.ClipRect.Right;
height:=canvas.ClipRect.Bottom;
for x := width-1 DownTo 0 do begin { horizontal von rechts nach links suchen }
result:=x;
for y:=0 to height-1 do begin { vertikal von oben nach unten suchen }
if canvas.Pixels[x,y]<>clWhite then exit;{ wenn Pixel gefunden dann Ende }
end;
end;
result:=-1; { result = -1 wenn keinen Pixel gefunden }
end;
{------------------------------------------------------------------------------}
{ sucht von oben nach unten den ersten Pixel ungleich weiss }
{ liefert 0.. height-1 zurück wenn Pixel gefunden wurde }
{ liefert -1 zurück wenn kein Pixel gefunden wurde }
function FindTop(canvas:TCanvas):Integer;
var x,y,width,height:Integer;
begin
width :=canvas.ClipRect.Right;
height:=canvas.ClipRect.Bottom;
for y:=0 to height-1 do begin { vertikal von oben nach unten suchen }
result:=y;
for x := 0 to width-1 do begin { horizontal von links nach rechts suchen }
if canvas.Pixels[x,y]<>clWhite then exit;{ wenn Pixel gefunden dann Ende }
end;
end;
result:=-1; { result = -1 wenn keinen Pixel gefunden }
end;
{------------------------------------------------------------------------------}
{ sucht von unten nach oben den ersten Pixel ungleich weiss }
{ liefert 0..height-1 zurück, wenn ein Pixel gefunden wurde }
{ liefert -1 zurück, wenn kein Pixel gefunden wurde }
{ UPPS, bei einer Paintbox von 310*170 Pixeln dauert das rund 30 Sekunden !!!!!!! }
function FindBottom(canvas:TCanvas):Integer;
var x,y,w,h:Integer;
begin
w:=canvas.ClipRect.Right;
h:=canvas.ClipRect.Bottom;
for y:=h-1 DownTo 0 do begin { vertikal von unten nach oben suchen }
result:=y;
for x := 0 to w-1 do begin { horizontal von links nach rechts suchen }
if canvas.Pixels[x,y]<>clWhite then exit;{ wenn Pixel gefunden dann Ende }
end;
end;
result:=-1; { result = -1 wenn keinen Pixel gefunden }
end;
Das dauert bei einer Paintbox mit 310*170 Pixel für jede Funktion so rund 30 Sekunden

und ist natürlich so völlig inakzeptabel.
Nun die Frage an die Experten, wie macht man das sinnvoller/schneller ?
Ich erwarte keine fertige Lösung von euch, nur einen neuen Ansatzpunkt für dieses Problem.
Manchmal sieht man ja den Wald vor Bäumen nicht....
