Скопируйте маленькие растровые изображения в большие растровые изображения с помощью прозрачности: что быстрее, чем graphics.DrawImage (smallBitmap, x, y)? - PullRequest
0 голосов
/ 19 марта 2010

Я определил этот вызов как узкое место в функции высокого давления.

graphics.DrawImage(smallBitmap, x , y);

Существует ли более быстрый способ смешать маленькие полупрозрачные растровые изображения в более крупную полупрозрачную?

Пример использования:

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);

Вызовы DrawImage принимают небольшие растровые изображения 32bppPArgb и копируют их в большие растровые изображения в местах, которые различаются, и небольшие растровые изображения могут лишь частично перекрывать видимую область больших растровых изображений. Оба изображения имеют полупрозрачное содержимое, которое смешивается с помощью DrawImage таким образом, который важен для вывода. Я провел некоторое тестирование с BitBlt, но не увидел значительного улучшения скорости, и альфа-смешение не получилось таким же в моих тестах. Я открыт практически для любого метода, включая лучший вызов bitblt или небезопасного кода на C #.

1 Ответ

0 голосов
/ 09 апреля 2010

После некоторого тестирования я вижу, что Дэн был прав (см. Комментарии выше). Можно превзойти производительность GDI Draw Image, если вам не нужны все функции смешивания, которые он предлагает, но в случае прозрачных смесей я не думаю, что есть место для улучшения материала.

...