2010年09月17日

第0x08回 画像の表示〜グラフィカルなアプリケーションのために〜

昨今のPCはスペックが上がり、OSやアプリケーションも
よりグラフィカルに、より美しい見た目になってきました。
よって、これからアプリケーションを作成する上で、
「見た目」も重要なファクターとなります。

その「見た目」を構成する上で重要になるのが、画像の表示です。
今回から数回に分けて、Windows上で画像を表示する方法を考えていきたいと思います。

Windowsで画像を表示する方法として、次の方法が考えられます。
@Win32APIの関数を使い、表示する(DDBとDIBなど)
ADirectXを使用し、表示する(DirectGraphicsなど)
BOpenGLを使用し、表示する
このブログでは、@Aを中心に解説していきたいと思っています。
Bは、完全に3Dとしての方法になってしまうので、省略します。

今回は、まず@のWin32APIを用いた方法を解説していきたいと思います。
Win32APIを用いてビットマップを表示するとき、
2つのタイプに描画の方法が分かれます。
ひとつはDDBで、もうひとつがDIBです。

DDB(DeviceDependentBitmap)とは、デバイス依存ビットマップと呼ばれ、
現在表示しているデバイス(=デバイスコンテキスト、HDC)に依存する形で
ビットマップを描画するものです。
DIB(DeviceIndependentBitmap)とは、デバイス独立ビットマップと呼ばれ、
DDBに対し、デバイスに依存することなくビットマップを描画します。

それぞれのメリット、デメリットは次のようになります。
〔DDB〕
 ●メリット
  現在のデバイスと親和性が高く(Compatible)、
  多くの場合、ビデオメモリ上に作成されるので
  描画が非常に高速
 ●デメリット
  CPUから遠い、ビデオメモリ上にビットマップが
  置かれるため、自前でのピクセル演算が低速(画像解析など)

〔DIB〕
 ●メリット
  メインメモリ上に確保されるため、
  自前でのピクセル演算が高速
 ●デメリット
  メインメモリ上に確保されるため、
  描画が低速


今回は、@のDDBの方法を使い画像を表示してみます。
早速サンプルを見てみましょう。


(サンプル:プロジェクトファイル)
sample008.zip

(サンプル:ソースファイルのみ)
WinMain008.cpp


まず、ビットマップのファイルをロードします。
その際に、ハンドル越しに操作を行うため、
ビットマップハンドルの変数を宣言します。
// ビットマップハンドル
HANDLE g_hBitmap = NULL;

ビットマップファイルをロードするには、下の関数を使用します。
// ビットマップをロードする
g_hBitmap = LoadImage( NULL , TEXT( "bitmap.bmp" ) , IMAGE_BITMAP , 0 , 0 , LR_LOADFROMFILE | LR_DEFAULTSIZE );
この関数は、第6引数のフラグによって、ロード元をファイルにすることができ、
フラグによっては、実行ファイルに関連付けられているリソースをロードすることもできます。

ハンドルは、その使用を終えた時点で解放してあげる必要があります。
// ビットマップを解放する
CloseHandle( g_hBitmap );

ここまでで、ビットマップのロードが完了しました。
ここからは、実際にデバイスコンテキストにビットマップを割り当て
画面のデバイスコンテキストに転送することにより表示を行います。

まず、画面と互換性のあるデバイスコンテキストを作成し、
そのデバイスコンテキストに先ほどロードしたビットマップを関連付けます。
// 互換デバイスコンテキスト作成
hMemDC = CreateCompatibleDC( hDC );
// 互換デバイスコンテキストにビットマップを設定する
SelectObject( hMemDC , g_hBitmap );

デバイスコンテキスト間の転送は下の関数を使います。
// ビットマップを表示
BitBlt( hDC , 0 , 0 , 800 , 600 , hMemDC , 0 , 0 , SRCCOPY );
BitBltの引数は次のとおりになります。
第1引数:転送先デバイスコンテキスト
第2引数:転送先左上座標X
第3引数:転送先左上座標Y
第4引数:転送サイズ幅
第5引数:転送サイズ高さ
第6引数:転送元デバイスコンテキスト
第7引数:転送元左上座標X
第8引数:転送元左上座標Y
第9引数:転送方法


以上で、DDBによるビットマップを表示することができました。
次回は、ビットマップのファイル構造について触れてみたいと思います。
タグ:ふわ猫
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/123098823
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。