【C#.NET】LockBitsはGraphic.DrawImageに勝てるのか?

2023.08.01

CATEGORY : C#.NET プログラミング

ポケモンスリープに課金したあんみんどうふです。

大量のBitmapを結合するためにGraphic.DrawImageでひたすら描画していたのですが、.NET備え付けの描画関連の処理は遅いものが多い印象が強いです(Bitmap.GetPixel、Bitmap.SetPixel、Bitmap.Clone等)。

もしかしてGraphicsも高速化できたり?と思い、LockBitsを使ったメモリ展開処理でGraphic.DrawImageを再現し、速度を比較してみようと思います。

とりあえずそれっぽく作る

フォームアプリケーションに600×600のPictureBoxを2つ置き、pictureBox1にはGraphics.DrawImage、pictureBox2にはLockBitsで描画した画像をセットしています。

サンプル画像として、いらすとや様から拝借した「ホログラムシールのイラスト」を使用しています。
正方形っぽくていい感じの画像が欲しかったもので。大きさは400×400とちょうどいい。

色も位置も200pxの余白も遜色なく、無事完コピです。

速度は以下の通り。

Graphic.DrawImage1ms
LockBits4ms

なんと意外にもDrawImageの方が早かった…。

 

関数化して10000回実行

回数を重ねれば変わってくるのでは?と思い検証してみます。

これをフォームのLoadイベントでDrawImageと共に10000回実行させます。

結果は以下の通り。

Graphics.DrawImage5056ms
LockBits32815ms

勝てません!対戦ありがとうございました!以上!