私は、この呼び出しが高圧機能のボトルネックであると特定しました。
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# コードへのより適切な呼び出しを含む、ほぼすべてのメソッドに対してオープンです。