PDA

Visualizza la versione completa : [Delphi] Lavorare con i pixel dello schermo


gygabyte017
31-01-2008, 21:04
Ciao a tutti, con il seguente codice:



procedure TForm1.FormCreate(Sender: TObject);
begin
Dkb:=TCanvas.Create;
Dkb.Handle:=GetWindowDC(0);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var i,j:integer; c:TColor; r,g,b,m:byte;
begin

for j := 0 to Screen.Height do
for i := 0 to Screen.Width do
begin
c:=Dkb.Pixels[i,j];
r:=GetRValue(ColorToRGB(c));
g:=GetGValue(ColorToRGB(c));
b:=GetBValue(ColorToRGB(c));
m:=(r+g+b) div 3;
dkb.Pixels[i,j]:= m Shl 16 Or m Shl 8 Or m;
end;
end;

dopo aver ottenuto la matrice di pixel dello schermo, un timer provvede a "ingrigire" tutti i pixel per dare l'effetto bianco e nero. Tutta via, per ridisegnare una volta uno schermo 1280x800 ci mette quasi 10 secondi! :dhò: Come si potrebbe ottimizzare l'algoritmo per farlo funzionare diciamo in realtime?

Grazie

oregon
31-01-2008, 21:17
In realtime ? Non mi pare possibile ...

Comunque puoi ottimizzare il codice per guadagnare tempo ... intanto questo

ColorToRGB(c)

lo farei calcolare una sola volta e userei una variabile ...

gygabyte017
31-01-2008, 23:18
L'ho ottimizzato un pochetto così:


begin
c1:=ColorToRGB(Dkb.Pixels[i,j]);
m:=( (c1 and $FF) + ((c1 and $FF00) shr 8) + ((c1 and $FF0000) shr 16) ) div 3;

dkb.Pixels[i,j]:= m Shl 16 Or m Shl 8 Or m;
end;



Ma è ancora lentino... Secondo me il rallentamento principale sta nella scrittura/lettura di un pixel per volta.... Bisognerebbe secondo me salvare l'array dei pixel, modificarlo apparte, e poi sovrascrivere quello dello schermo così invece di pixel per pixel modifica con tutto lo schermo in blocco....
Ma come implementare una cosa del genere??

RiGrazie!

Loading