Copie pequenos bitmaps em bitmap grande com a mistura de transparência: o que é mais rápido que gráficos.drawimage (smallbitmap, x, y)?

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

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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top