Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [Delphi] Lavorare con i pixel dello schermo

    Ciao a tutti, con il seguente codice:

    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! Come si potrebbe ottimizzare l'algoritmo per farlo funzionare diciamo in realtime?

    Grazie

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    L'ho ottimizzato un pochetto così:
    codice:
        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!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.