GDI+のBitmapでJpegと透過PNG画像を読み込む

Windows XP以降に標準搭載されているGDI+を使うと、.NET Frameworkと同等のグラフィック機能をWin32APIベースのプログラムから使うことができます。GDI+のオブジェクトには、Visual C++からもC++のクラスとしてアクセスできるようになっているので、今回はGDI+のBitmapオブジェクトで画像ファイルを読み込んでみることにしましょう。

GDI+を使う手順は、以下の通りです。

GdiplusStartupInput()で初期化
GDI+のオブジェクトを生成し、描画処理などを行う
GDI+オブジェクトを削除
GdiplusShutdown()で終了処理

ただし、これらのオブジェクトや関数はGdiplusというnamespace(C++の名前空間)の中にあるので、namespaceを先頭につけるかusingで名前空間を読み込んでおく必要があります。

今回試してみるBitmapオブジェクトは、GDI+のオブジェクトに描画したりGDIのHBITMAPに変換できるビットマップです。「画像ファイルのパス文字列」や「画像データを読み込んだIStream」からBitmapオブジェクトを作成するコンストラクタ・静的関数もあるので、GDI+で対応しているデータ形式の画像(BMP、PNG、Jpegなど)を簡単に扱うことができます。

たとえば、pngファイルを読み込んでBitmapを作るなら、以下のようにファイルのパス(ワイド文字列にする必要があるので注意)を引数にコンストラクタを呼び出すだけです。

g_bmp2 = new Gdiplus::Bitmap(L"d:/test.png");

同様に、コンストラクタに画像データに関連付けたIStreamを渡すだけでBitmapを作ることもできます。

こうして作成したBitmapは、GraphicsオブジェクトのDrawImage()などで描画できます。Win32APIで扱うウインドウ上に描画する場合は、ウインドウのHDCやGDIビットマップのメモリデバイスコンテキストからGraphicsオブジェクトを作成することになるでしょう。

今回は、ウインドウのWM_PAINT処理で以下のようにしてみました。

  hdc = BeginPaint(hwnd, &ps);

  /* GDI+のGraphicsオブジェクトを作成 */
  g = new Gdiplus::Graphics(hdc);

  /* 画像を読み込んでおいたBitmapを描画 */
  g->DrawImage(g_bmp1, 0, 0);
  g->DrawImage(g_bmp2, 0, 0);

  /* Graphicsオブジェクトを破棄 */
  delete g;

  EndPaint(hwnd, &ps);

プログラムソース表示(VC++用C++ソース)

テストプログラムでは、二つの画像を読み込んで描画しています。ファイルのパスに適当な画像ファイルを指定し、どんな感じで描画されるか試してみましょう。g_bmp2の方が上に描かれるので、こちらのパスに透過pngを指定してみてください。

従来のAPIベースでは困難だったJpegやPNG(透過情報対応)画像ファイルも簡単に扱えるので、なかなか便利ですね。


プログラミング資料庫 > Windowsプログラミング研究室