イメージリストに登録した画像をビットマップに保存したい

[戻る]
ぷー 2002/10/08(火) 14:53:33
お世話になります。

複数のビットマップをサムネイルとしてビットマップに保存するプログラムを
作っています。まずイメージリストを作成し、そこにビットマップを登録しました。
そして、その登録された全ての画像を一つの画像として保存しようとしたのですが、
どうやればいいのか分からなかったので質問させていただきました。
Webや過去ログを探してみたのですが、そういうことをする人もあまりいないようで
見つける事ができませんでした(逆はたくさんありましたけど)。
こんな方法があるよとかいうのがありましたら是非ご教授ください。

dairygoods 2002/10/09(水) 11:05:52
基本的には読込みの逆を行えば良いです。

BITMAPFILEHEADERとBITMAPINFOを用意して、
GetDIBitsでDIBビットデータを取得し、
ファイルに出力します。

ぷー 2002/10/11(金) 15:12:02
レスありがとうございます。

早速以下のようなコードを書いてみました。

-- ここから(抜粋)
BITMAPINFO        m_BMInfo;
BITMAPFILEHEADER  m_BMFH;
HDC               hDC,
                  hMemDC;
LPBYTE            m_lpBits = NULL; // ビット列
IMAGEINFO         ImgInfo;         // イメージリストのビットマップ情報
HBITMAP           hBitmap;         // ビットマップハンドル
                  hBitmapOld;      
BITMAP            bm;

ImageList_GetImageInfo(hImageList, 0, &ImgInfo);
GetObject(ImgInfo.hbmImage, sizeof(BITMAP), &bm);   ←(1)

hDC = GetDC(NULL);
hMemDC = CreateCompatibleDC(hDC);
ReleaseDC(NULL, hDC);
hBitmapOld = (HBITMAP)SelectObject(hMemDC, ImgInfo.hbmImage);
int l = GetDIBits(hMemDC, ImgInfo.hbmImage, 0, bm.bmHeight, m_lpBits, 
&m_BMInfo, DIB_RGB_COLORS);

-- 以下他のコードが続く

イメージリストには、100×100のビットマップファイルがたくさん入っています。
ところが、(1)の部分で取得したビットマップ情報がすでに間違っていて、400×200の
画像になっていました。また、ImgInfo.hbmImageにはハンドルが入っているのに、
GetDIBits関数は失敗しているようです。それぞれの引数には問題がないと思うのです
が・・・。あれれ?ってな感じです。
私が書いたコードのおかしなところとかありますでしょうか?お気づきの点があれば
教えてください。よろしくお願いします。

dairygoods 2002/10/15(火) 13:07:40
イメージリストは、複数の画像を1枚の大きなビットマップに並べて管理しています。
ImageList_GetImageInfoで得られるImgInfo.hbmImageは、
その大きなビットマップへのハンドルで、
ImgInfo.rcImageがそのビットマップ内のどの領域が指定した番号の
イメージに相当するかを表しています。

> int l = GetDIBits(hMemDC, ImgInfo.hbmImage, 0, bm.bmHeight, m_lpBits, 
> &m_BMInfo, DIB_RGB_COLORS);

気になる点ですが、
・メモリDCを用意しなくても、画面のDCで良いと思います。
・m_lpBitsのメモリは呼び出し側で確保する必要があります。
・m_BMInfoは呼び出し側で設定しておく必要があります。
(第四引数をNULLにして呼び出すと、適当に設定してくれるとヘルプにあります)

古いスレッドには追加発言できません。