Danke erstmal für deinen Tipp!
Habe mir gestern Abend noch ein paar Beiträge zu dem Thema durchgelesen und es hörte sich ja vielversprechend an, auch wenn ich es noch nicht zu 100% verstanden habe.
In der Hoffnung das zu ändern hab ich heute morgen einfach schnell ein kleines Programm zum Testen gemacht, welches nach ein bisschen rumprobieren auch funktionierte. Nun versuche ich, das ganze auf mein Hauptprogramm zu übertragen, ich erhalte jedoch immer einen Fehler. Gibt es da noch etwas über Scanline, das ich wissen müsste? Es scheint, als dürfte man "p^[X]" nur einmal benutzen, weil ich immer eine Exeption bekomme, wenn ich es ein zweites mal verwende, egal in welcher reihenfolge..
Hier mal eine Procedur (An der makierten Stelle kommt die Fehlermeldung):
Delphi-Quellcode:
procedure TForm1.AnalysePIC2;
type
PixArray = Array [1..3] of Byte;
VAR p: ^PixArray;
VAR X,Y,Farbtoleranz:Integer;
VAR RValSel,GValSel,BValSel:Byte;
Begin
// Standartwerte //
PB_Small.Max:=PIC_Breite*3;
PB_Small.Position:=0;
AnyLine:=False;
for X := 0 to PIC_Breite do
Begin
PB_Small.Position:=PB_Small.Position+1;
for Y := 0 to PIC_Höhe do
Begin
Line[X,Y]:=False;
End;
End;
// /Standartwerte //
PB_Main.Position:=PB_Main.Position+3;
PIC_res.Assign(PIc_res2);
Farbtoleranz:=Ceil(SB_Farbtoleranz.Position*255/100);
RValSel:=GetRValue(Color_Analysefarbe.Selected);
GValSel:=GetGValue(Color_Analysefarbe.Selected);
BValSel:=GetBValue(Color_Analysefarbe.Selected);
for Y := 0 to PIC_Höhe-1 do
Begin
PIC_Res.ScanLine[Y];
for X:=0 To PIC_Breite-1 do
Begin
if SB_Farbtoleranz.Position>0 then
Begin
if (((Abs(RValSel-P^[3]))<=Farbtoleranz) AND ((Abs(GValSel-P^[2]))<=Farbtoleranz) AND ((Abs(BValSel-P^[1]))<=Farbtoleranz)) then
Begin
AnyLine:=True;
Line[X,Y]:=True;
LinePTK:=LinePTK+1;
End
else
Begin
//Weiß
p^[3]:=255;
Delphi-Quellcode:
p^[2]:=255;
p^[1]:=255;
Inc(p);
End;
End
Else
Begin
if ((p^[3]=0) AND (p^[2]=0) AND (p^[1]=0)) then
Begin
AnyLine:=True;
Line[X,Y]:=True;
LinePTK:=LinePTK+1;
End
else
Begin
p^[3]:=255; //Weiß
p^[2]:=255;
p^[1]:=255;
Inc(p);
End;
End;
End;
End;
.
.
.
Was mache ich denn falsch?
Und zu dem Inline: Verstehe ich es richtig, dass es also die Programmgeschwindigkeit erhöht, weil der PC dann nicht "hin und her springen" muss? Aber warum macht man das dann nicht immer? Die Datei wird vielleicht ein bisschen größer, aber soviel kann das doch nicht ausmachen, oder?