2010-08-25 14 views
7

Estoy tratando de cargar imágenes rápidamente en un cuadro de imagen y dibujar sobre ellas. Tengo un retraso de .13 segundos entre el momento en que asigno un mapa de bits al cuadro de imagen y cuando aparece. Y cada vez que hago un picturebox.refresh(), es el mismo retraso de .13 - .15 segundos antes de que se llame al método de pintura. ¿Hay alguna manera de deshacerse de este retraso?Mostrar cuadro de imagen más rápido

Estoy usando C# en Visual Studio 2010. Cargo las imágenes usando la biblioteca FreeImage.

Este es el código en mi caso pictureBox_MouseMove:

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

Entonces trazar una línea cuando mi caso se llama pintura. La demora es entre las dos líneas de rastreo.

Si utilizo una imagen tiff bitonal a 117 kb, la demora es .13 segundos. Para cargar esta imagen en la memoria toma 0.04 segundos. Para reemplazar mi mapa de bits picturebox con este mapa de bits toma 0.01 segundos.

Si uso una imagen de jpg de escala de grises a 1125kb, la demora es .14 segundos. Para cargar esta imagen en la memoria toma .26 segundos. Para reemplazar mi mapa de bits picturebox con este mapa de bits toma 0.03 segundos.

Respuesta

11

Suponiendo que no hay otros retrasos en su código que impedirían el hilo de interfaz de usuario vuelva a entrar en el bucle de mensajes para que el método OnPaint() puede ser llamado: el controlador de eventos de pintura se llama después cuadro de imagen ha llegado a la Imagen. Todavía no está visible, PB usa doble buffering.

Esa imagen se vuelve costosa cuando se tiene que redimensionar para ajustarse al área del cliente del PB. Lo cual es muy probable en su caso porque sus imágenes son bastante grandes. Utiliza un filtro bicúbico de alta calidad para que la imagen redimensionada se vea bien. Eso es bastante caro, aunque el resultado es bueno.

Para evitar ese gasto, cambie el tamaño de la imagen antes de asignarla a la propiedad de la imagen. Hazlo tan grande como el tamaño del cliente de PB.

Eso va a hacer una gran diferencia en sí mismo. Lo siguiente que puede hacer es crear el mapa de bits escalado con el formato de 32bppPArgb píxeles. Es el formato que es aproximadamente 10 veces más rápido que cualquier otro porque coincide con el adaptador de video en la mayoría de las máquinas, por lo que no es necesario realizar conversiones de formato de píxeles.

Algunos código:

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; 
     } 
    } 

Usted probablemente querrá jugar con esto para que la imagen conserva su relación de aspecto. Pruébelo primero tal como está para asegurarse de obtener la mejora del rendimiento.

+0

Hans, ¡eso puede hacerlo! ¡Las pruebas iniciales son definitivamente mejores! Ajustándolo en mi código aquí y estableciendo la relación de aspecto correctamente ... – Mark

+0

Hans, ¡eso fue perfecto! ¡Muy agradable! ¡Gracias! – Mark