在复制小位图大的位图与透明混合:什么是快于graphics.DrawImage(smallBitmap,X,Y)?
-
21-09-2019 - |
题
我已经确定这个呼叫为高压力函数的一个瓶颈。
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的,但没见过显著速度的提高和alpha混合没有出来一样在我的测试。我接受几乎任何方法,包括更好地调用的BitBlt或不安全的C#代码。
解决方案
一些测试后我看到丹是正确的(见上文注释)。这是可能击败GDI绘制图像的性能,如果你并不需要所有它提供的混合功能,但在透明度的情况下融合,我不认为有空间的材料的改进。
不隶属于 StackOverflow