Mostrar cuadro de imagen más rápido

Intento cargar imágenes rápidamente en una caja de imágenes y dibujar sobre ellas. Tengo un retraso de .13 segundos entre el momento en que asigno un bitmap 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?

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

Aquí está el código en mi evento pictureBox_MouseMove:

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

Luego trazaré una línea cuando se llame a mi evento de 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 bitmap picturebox con este bitmap toma 0.01 segundos.

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

    Suponiendo que no haya otros retrasos en su código que impidan que el subproceso UI vuelva a entrar en el bucle de mensajes para que se pueda llamar al método OnPaint (): se llama al controlador de eventos Paint después de que PictureBox haya dibujado 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 de clientes 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 usted mismo antes de asignarla a la propiedad 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 bitmap 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.

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

    Es probable que desee 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.