Pequeña copia de mapas de bits a mapa de bits grande con fusión de transparencia: ¿Qué es más rápido que Graphics.DrawImage (smallBitmap, x, y)?

StackOverflow https://stackoverflow.com/questions/2475233

Pregunta

He identificado esta llamada como un cuello de botella en una función de alta presión.

graphics.DrawImage(smallBitmap, x , y);

¿Hay una manera más rápida para mezclar pequeños mapas de bits semi transparentes en uno semi transparente más grande?

Ejemplo de Uso:

XY[] locations = GetLocs();
     Bitmap[] bitmaps = GetBmps(); //small images sizes vary approx 30px x 30px

        using (Bitmap large = new Bitmap(500, 500, PixelFormat.Format32bppPArgb))
        using (Graphics largeGraphics = Graphics.FromImage(large))
        {
          for(var i=0; i < largeNumber; i++)
          {
            //this is the bottleneck
            largeGraphics.DrawImage(bitmaps[i], locations[i].x , locations[i].y); 
         }
       }

       var done = new MemoryStream(); 
       large.Save(done, ImageFormat.Png); 
       done.Position = 0;
       return (done);

Las llamadas DrawImage tomar una pequeña mapas de bits 32bppPArgb y los copia en un mapa de bits mayor en lugares que varían y los pequeños mapas de bits sólo se pueden solapar parcialmente los mapas de bits grandes área visible. Ambas imágenes tienen contenidos semi transparentes que quedan mezclados por DrawImage de una manera que es importante para la salida. He hecho algunas pruebas con BitBlt pero no visto una mejora significativa la velocidad y la mezcla alfa no salió del mismo en mis pruebas. Estoy abierto a casi cualquier método, incluso una mejor llamada a BitBlt o código C # inseguro.

¿Fue útil?

Solución

Después de algunas pruebas Veo que Dan era correcto (ver comentarios anteriores). Es posible vencer GDI obtener rentabilidad de imágenes, si no necesita todas las características de mezcla que ofrece, pero en el caso de la transparencia combina No creo que hay espacio para la mejora material.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top