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)?
-
21-09-2019 - |
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.
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.