イメージリストに登録した画像をビットマップに保存したい – プログラミング – Home

イメージリストに登録した画像をビットマ...
 
通知
すべてクリア

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


ぷー
 ぷー
(@ぷー)
ゲスト
結合: 24年前
投稿: 28
Topic starter  

お世話になります。

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


引用解決済
トピックタグ
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

基本的には読込みの逆を行えば良いです。

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


返信引用
ぷー
 ぷー
(@ぷー)
ゲスト
結合: 24年前
投稿: 28
Topic starter  

レスありがとうございます。

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

-- ここから(抜粋)
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
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

イメージリストは、複数の画像を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にして呼び出すと、適当に設定してくれるとヘルプにあります)


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました