0

私は、この呼び出しが高圧機能のボトルネックであると特定しました。

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# コードへのより適切な呼び出しを含む、ほぼすべてのメソッドに対してオープンです。

4

1 に答える 1

0

いくつかのテストの後、Dan が正しかったことがわかりました (上記のコメントを参照)。GDI Draw Image が提供するすべてのブレンディング機能を必要としない場合、GDI Draw Image のパフォーマンスを上回ることは可能ですが、透明ブレンドの場合、マテリアルを改善する余地はないと思います。

于 2010-04-09T17:40:17.100 に答える