VC++でGDI+ そにょ3 〜画像の読み込み1〜

自分が使わなかった部分は知識で書いて、実際に試してないから動くかわかんね。

ImageクラスとBitmapクラス

画像はImageクラスで扱う。BitmapクラスはImageクラスを継承している。そのため引数がImageクラスのインスタンスやその参照になっているメソッドにBitmapクラスのインスタンスやその参照を渡してもよい*1。BitmapクラスはGDIのHBITMAPに対応している。Bitmapクラスはピクセル単位での操作が可能である。

フォルダから読み込む

Imageオブジェクトの作成はコンストラクタ、またはFromFileメソッドを用いる。BMP、GIF、JPEGPNGTIFF、EMFを読み込むことができる。

Image(const WCHAR *filename, BOOL useEmbeddedColorManagement);
static Image *FromFile(const WCHAR *filename, BOOL useEmbeddedColorManagement);

Image myImage1(L"hoge.bmp");
Image* myImage2 = new Image(L"fuga.png");
Image* myImage3 = Image::FromFile(L"foo.jpg")

Bitmapオブジェクトとして読み込むときも同様。

Bitmap myBitmap1(L"hoge.gif");
Bitmap* myBitmap2 = new Bitmap(L"fuga.emf");
Bitmap* myBitmap3 = Bitmap::FromFile(L"foo.tif");

リソースからBitmapを読み込む

FromResourceメソッドを用いる。

static Bitmap *FromResource(HINSTANCE hInstance, const WCHAR *bitmapName);

hInstanceはGetModuleHandle(NULL)でHMODULEを取得、bitmapNameはMAKEINTRESOURCE()にリソースID、例えばIDB_BITMAP1を渡して取得。

LPCTSTR pResourceName = MAKEINTRESOURCE(IDB_BITMAP1);
HMODULE hInstance = GetModuleHandle(NULL);
pBitmap = Bitmap::FromResource(hInstance, (const WCHAR *)pResourceName);

Unicode環境であれば(const WCHAR *)のキャストは不要なはず。

*1:BitmapからImageを作れないか必死に悩んだのは今でも良い思い出。いや、悪い思い出か。