読み込んだ画像のサイズを取得

さて、画像を読み込めるようになったのはいいことなのですが
いろんなビットマップを読み込んで表示しようとするには、
ビットマップのサイズを取得できなくては汎用性がありませんね。
(ビットマップを設定したメモリDCのサイズを測るという方法も使えるかもしれませんが)
今回はGetObjectという関数を使って取得してみます。

GetObject

「多重起動の防止」のソースをスケルトンとして使います。
ウィンドウプロシージャ内に以下の内容を追加していきましょう。

     //デバイスコンテキスト・仮想DC
     HDC hdc, hdcMem;
     PAINTSTRUCT paint ;
     //読み込むビットマップ
     HBITMAP hBitmap;
     //幅・高さを入れる
     BITMAP bmp;

いつものようにDCとメモリDCなどの宣言をした上で、
今回はサイズを取得するのに使うBITMAP 構造体を宣言します。

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

               //ビットマップを読み込む
               hBitmap = SHLoadDIBitmap(_T("\\My Documents\\bmp.bmp"));
               //hBitmapのサイズを取得し、bmpに入れる
               GetObject(hBitmap,sizeof(BITMAP), &bmp);
               //仮想デバイスコンテキストを作成
               hdcMem = CreateCompatibleDC(NULL);
               //仮想デバイスコンテキストにビットマップを設定
               SelectObject(hdcMem, hBitmap);

               int x,y;
               for(x=0;x<(240/bmp.bmWidth);x++){
                    for(y=0;y<(296/bmp.bmHeight);y++){
                         //仮想DCからDCへコピー
                         BitBlt(hdc,x*bmp.bmWidth,y*bmp.bmHeight,bmp.bmWidth,bmp.bmHeight,
                                hdcMem,0,0,SRCCOPY);
                    }
               }

               //仮想デバイスコンテキストを削除
               DeleteDC(hdcMem);
               //ビットマップを削除
               DeleteObject(hBitmap);

               //デバイスコンテキストを解放
               EndPaint(hwnd, &paint);

SHLoadDIBitmap関数でビットマップをメモリに読み込みます。
なお、このプログラムでも微妙な画像だーーー!このビットマップを
MyDocumentsディレクトリに置いて、使っています。
いつも通りメモリDCを作成し、selectobjectでビットマップをメモリDCに設定します。

今回はGetObject 関数で読み込んだhBitmapのサイズをBITMAP構造体に格納します。
このサイズを使って、タイルパターンで隙間なく画面に敷き詰めていきます。
描画が終わったら、メモリDCを削除した後ビットマップを削除します。
では実行してみましょう。

ビットマップのタイル表示

しかしこの画像はちょっとあれですね。
使いまわしもなんなので、次やるときは別の画像を作ってみようと思います。

int GetObject( HGDIOBJ hgdiobj, int cbBuffer, LPVOID lpvObject);
・GDIオブジェクトのサイズを取得します
第一引数 hgdiobj には、論理ビットマップなどのハンドルを指定します (in)
第二引数 cbBuffer には、バッファに書かれる情報のバイト数を指定します (in)
第三引数 lpvObject には、第一引数に対応する情報を受け取るGDIオブジェクトのポインタを指定します (out)

戻り値 成功ならバッファに格納されたバイト数が、失敗なら0 が返ります。

ソースの表示

2005/6/26


戻る