C#プログラム画像処理

【C#】24bitと32bitカラー画像の表示速度の比較

カラー画像の24bitカラーと32bitカラーの画像はR,G,Bの成分はそれぞれ8bitで表現され、32bitの時に、残りの8bit部分で画像の透過率として使われる場合もありますが、画像処理的には、あまり使われる事はありません。

そのため、カラー画像と言えばメモリ容量の少ない24bitカラー画像を扱う事が、個人的には多かったのですが、GPU処理やSIMD処理などを考慮すると、メモリアクセス的に有利な32bitカラーの方が都合が良い場合もあります。

 

そこで今回は、24bitカラーと32bitカラーとで、表示速度に違いがあるか?調べてみました。

 

評価に用いたプログラムのイメージはこちら↓

24bitRGBと32bitRGB画像の表示速度の比較

 

プログラムは以下のような物で、PictureBoxのImageに指定するBitmapクラスオブジェクトのPixelFormatが

  • Format24bppRgb
  • Format32bppRgb
  • Format32bppArgb
  • Format32bppPArgb

の違いによって違うか?

また、表示する画像データが24bitのカラー画像と32bitのカラー画像で違いが出るか?を検証してみました。

 

24bitRGBと32bitRGB画像の表示速度の比較

 

表示に用いた画像サイズは1024×1024画素で24bitと32bitのカラー画像となります。

この画像を1000回表示した時の表示時間から1秒あたりに表示できた画像枚数(フレームレート[fps])を算出し、この値を5回計測し平均したものが以下の結果となります。

 

24bitカラー画像 32bitカラー画像
Format24bppRgb 139.7 142.3
Format32bppRgb 140.3 150.1
Format32bppArgb 123.6 126.6
Format32bppPArgb 182.0 187.8

 

これを見ると、32bitカラー画像の方が少し表示速度が速く、Graphicsオブジェクトに用いたPixelFormatは Format32bppPArgb が少し突出して速い事が分かりました。

 

この Format32bppPArgb とは何か?調べてみると

 

1 ピクセルあたり 32 ビットの形式であることを指定します。つまり、アルファ、赤、緑、および青のコンポーネントに、それぞれ 8 ビットを使用します。 アルファ コンポーネントに応じて、赤、緑、および青のコンポーネントが事前乗算されます。

 

とのこと。

いまいち理解できませんが、事前乗算している事で速いのか??

 

という事で、FromImageメソッドで使うGraphicsオブジェクトは Format32bppPArgb を使うと良さそうです。

 

少し前(32bitOSがメインだった時代)では、搭載できるメモリサイズは2GBだし、実質的にプログラムが使用できるのは1GB程度しか無かったため、メモリサイズはできるだけ節約したかったため、カラー画像と言えば24bitと思っていたのですが、今では64bitOSが当たり前で、メモリも4~8GBぐらいは普通に搭載されているので、32bitカラーデータもありですね。

 

画像処理のためのC#テクニックへ戻る

コメント

タイトルとURLをコピーしました