2010-08-25 16 views
7

Sto tentando di caricare rapidamente le immagini in una casella immagine e disegnarle. Ho un secondo ritardo di .13 tra il momento in cui assegno una bitmap alla casella immagine e quando si presenta. E ogni volta che eseguo uno picturebox.refresh(), è lo stesso ritardo di 0,13 - 0,15 secondi prima che venga chiamato il metodo paint. C'è un modo per sbarazzarsi di questo ritardo?Visualizzazione più veloce della casella dell'immagine

Sto utilizzando C# in Visual Studio 2010. Carico le immagini utilizzando la libreria di FreeImage.

Ecco il codice nel mio caso pictureBox_MouseMove:

if (IsMouseDown || DrawLine.Checked || IsMovingBox) 
{ 
    Tracing.Trace("Update Picture Box"); 
    pictureBox.Refresh(); 
} 

Poi tracciare una linea quando il mio caso la vernice viene chiamato. Il ritardo è tra le due linee di traccia.

Se utilizzo un'immagine tonica bitonale a 117kb, il ritardo è di 0,13 secondi. Per caricare questa immagine in memoria ci vogliono 0,04 secondi. Per sostituire la mia bitmap picturebox con questa bitmap sono necessari 0,01 secondi.

Se utilizzo un'immagine jpg in scala di grigi a 1125 kb, il ritardo è di 0,14 secondi. Per caricare questa immagine in memoria occorrono 0,26 secondi. Per sostituire la mia bitmap picturebox con questa bitmap sono necessari 0,03 secondi.

risposta

11

Supponendo che non ci siano altri ritardi nel codice che impedirebbero il thread dell'interfaccia utente di rientrare il ciclo di messaggi in modo che il metodo OnPaint() può essere chiamato: il vostro gestore di eventi della vernice viene chiamato dopo PictureBox ha attirato l' Immagine. Non è ancora visibile, PB usa il doppio buffering.

L'immagine diventa costosa da disegnare quando deve essere ridimensionata per adattarsi all'area client del PB. Il che è molto probabile nel tuo caso perché le tue immagini sono piuttosto grandi. Usa un filtro bi-cubico di alta qualità per rendere l'immagine ridimensionata un bell'aspetto. È piuttosto costoso, anche se il risultato è buono.

Per evitare tali spese, ridimensionare l'immagine prima di assegnarla alla proprietà Immagine. Rendilo grande quanto ClientSize di PB.

Questo farà una grande differenza in sé. La prossima cosa che puoi fare è creare la bitmap scalata con il formato pixel 32bppPArgb. È il formato che è circa 10 volte più veloce di qualsiasi altro perché corrisponde alla scheda video sulla maggior parte delle macchine, quindi non sono necessarie conversioni in formato pixel.

Alcuni codice:

private void loadImage(string path) { 
     using (var srce = new Bitmap(path)) { 
      var dest = new Bitmap(pictureBox1.Width, pictureBox1.Height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb); 
      using (var gr = Graphics.FromImage(dest)) { 
       gr.DrawImage(srce, new Rectangle(Point.Empty, dest.Size)); 
      } 
      if (pictureBox1.Image != null) pictureBox1.Dispose(); 
      pictureBox1.Image = dest; 
     } 
    } 

Probabilmente si vorrà sperimentare con questo modo l'immagine conserva le proporzioni. Provalo prima di tutto per assicurarti di ottenere il miglioramento perfetto.

+0

Hans, potrebbe farlo! I test iniziali sono decisamente migliori! Inseriscilo nel mio codice qui e impostando correttamente le proporzioni ... – Mark

+0

Hans, è stato perfetto! Molto bella! Grazie! – Mark

Problemi correlati