BMP,JPG,GIF,PNGをファイルから読み込んで表示

すいません。前回ではビットマップだけしか読めないようなことを言っていましたが
あれから調べてみると、なんとビットマップだけでなく
JPGやPNG,GIFといった形式のファイルも読み込んで表示できることが判りました。

SHLoadImageFile

この関数を使えば、上記のフォーマットを扱えるようです。
これは画像にかかるサイズの削減につながりますね。
「多重起動の防止」のソースをスケルトンとして使います。
ウィンドウプロシージャ内に以下の内容を追加していきましょう。

     //デバイスコンテキスト・仮想DC
     HDC hdc, hdcMem;
     PAINTSTRUCT paint ;
     //読み込むビットマップ
     HBITMAP hBitmap;
     //透過色
     COLORREF TranspColor;

画面上のデバイスコンテキストとビットマップ、
ビットマップ用のメモリDCのハンドルを
格納するための変数を宣言します。
また透過描画も扱うので、透過色用変数も宣言します。

               //デバイスコンテキストを取得
               hdc = BeginPaint(hwnd, &paint);

               //画像(bmp,jpg,png,gif)を読み込む
               hBitmap = SHLoadImageFile(_T("\\My Documents\\png.png"));
               //仮想デバイスコンテキストを作成
               hdcMem = CreateCompatibleDC(NULL);
               //仮想デバイスコンテキストにビットマップを設定
               SelectObject(hdcMem, hBitmap);

               //仮想DCからDCへコピー・透過コピー
               BitBlt(hdc,0,0,32,32,hdcMem,0,0,SRCCOPY);
               TranspColor=GetPixel(hdcMem,0,0);
               TransparentImage(hdc,104,80,32,32,hdcMem,0,0,32,32,TranspColor);

               //仮想デバイスコンテキストを削除
               DeleteDC(hdcMem);
               //ビットマップを削除
               DeleteObject(hBitmap);
               //デバイスコンテキストを解放
               EndPaint(hwnd, &paint);

SHLoadImageFile 関数で画像をメモリに読み込みます。
ファイルを読み込む時は絶対パスを指定しなくてはなりません。
ちなみに、このプログラムでは、また微妙な画像だーーー!このPNG形式のファイルを
MyDocumentsディレクトリに置いて、使うことにします。
(単に拡張子を変えたわけではなく、本物のPNGファイルです。念のため)
メモリDCを作成し、SelectObjectでビットマップをメモリDCに設定します。

BitBltで描画し、ビットマップの(0,0) の色を透過色にして
TransparentImageで透過描画しています。
用が終わったらメモリDCを削除し、ビットマップを削除します。
では実行してみましょう。

PNGファイルをスプライト表示

PNGファイルならなんとか透過の用途にも使えることが判りました。

ちなみにこのbmp,jpg,gif,pngといった4つの形式の共通点は、
IEで表示できるということがあります。つまりOSレベルで
サポートされるようになったから簡単に扱えるわけですね。
そのへんは素直にMicrosoft様に感謝しておきましょう。
しかし、PNG形式が対応されたのは比較的最近なので、
以前の古いマシンではPNGファイルをIEで表示できないものがありますが
そういったマシンでは多分この関数でPNGファイルを表示できないので気をつけてください。

HBITMAP SHLoadImageFile ( LPCTSTR pszFileName);
・GIFを読み込みます(とMSDNにはありますが、PNGやJPGもいけるようです)
第一引数 pszFileName には、読み込むファイル名を指定します

戻り値 成功ならビットマップのハンドルが、失敗ならNULL が返ります。
※この関数を使うには、aygshell.h を宣言する必要があります

ソースの表示

2005/6/26


戻る