Copie pequenos bitmaps em bitmap grande com a mistura de transparência: o que é mais rápido que gráficos.drawimage (smallbitmap, x, y)?
-
21-09-2019 - |
Pergunta
Eu identifiquei essa chamada como um gargalo em uma função de alta pressão.
graphics.DrawImage(smallBitmap, x , y);
Existe uma maneira mais rápida de misturar pequenos bitmaps semi -transparentes em um semi -transparente maior?
Exemplo 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);
As chamadas de drawimage pegam um pequeno bitmaps de 32bppPargb e os copia para um bitmap maior em locais que variam e os pequenos bitmaps podem se sobrepor parcialmente na área maior de bitmaps. Ambas as imagens têm conteúdos semi -transparentes que são misturados pelo Drawimage de uma maneira importante para a saída. Fiz alguns testes com o BitBLT, mas não vi uma melhoria significativa de velocidade e a mistura alfa não saiu da mesma forma nos meus testes. Estou aberto a qualquer método, incluindo uma chamada melhor para o código b# bitblt ou inseguro.
Solução
Depois de alguns testes, vejo que Dan estava certo (veja os comentários acima). É possível vencer o desempenho da imagem do GDI Draw se você não precisar de todos os recursos de mistura que ele oferece, mas no caso de misturas de transparência, não acho que haja espaço para melhorias materiais.