[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/05/10(Thu) 19:26
投稿者名:はやし
Eメール:
URL :
タイトル:
メモリDCからビットマップファイルに保存するには?
VB6.0を使っています。

メモリDCからPictureBoxに撮像データを転送し、描画させています。
画像のサイズがPictureBoxよりも大きい為、PictureBoxにスクロールバーをつけたのですが、
BitBltを使うと、転送先の矩形領域に合わせる為、AutoSizeをTrueにしても、
画像全部を見る事が出来ません。
やりたいのは、元の画像サイズを変えずに保存する事なので、StretchBltも使えません。

そこで、メモリDC上にあるBitmapオブジェクトをBitmapファイルに保存する事が出来ればと
思ったのですが、いい方法が思いつきません。

この場合、Bitmapファイルを自力でつくらなければいけないのでしょうか?

何か他に良い方法を知っている方がいらっしゃいましたら、是非アドバイスお願いします。

投稿時間:2007/05/11(Fri) 07:42
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: メモリDCからビットマップファイルに保存するには?
> 画像のサイズがPictureBoxよりも大きい為、PictureBoxにスクロールバーをつけたのですが、

この時に画像はどのように表示させているのですか?
通常は、画像サイズのPictureBoxに表示させ、そのPictureBoxをスクロールさせるのでは。

投稿時間:2007/05/11(Fri) 11:04
投稿者名:はやし
Eメール:
URL :
タイトル:
Re^2: メモリDCからビットマップファイルに保存するには?
花ちゃんさん、お返事有難うございます。

> この時に画像はどのように表示させているのですか?

画像はカメラで撮影したものを某会社のdllの関数を使って読込んで、PictureBoxに反映させています。PictureBoxを2枚貼り付けて、内側のPictureBoxにSelectObjectしたものをBitBltで転送します。その横に垂直スクロールバーと水平スクロールバーをつけています。
因みに取得したデータの画像サイズは1360×1024です。

PictureBox自体はスクロールバーを動かすと、中身も動くので連携は取れていると思うのですが、
画像はPictureBoxのサイズでしか表示出来ません。

私はその原因はBitBltを使っている為と考えています。(転送先DCの矩形領域に合わせているから?)
表示だけの問題なら、スクロールバーを動かす度に転送処理をすれば描画は出来るのだと思いますが、私がやりたいのは、画像データをそのままビットマップファイルに保存することなのです。
なのでSavePictureしても、切り取られて表示している部分しか保存されず、意味がありません。

そこで、メモリDC上にあるビットマップをそのままファイルに落とすことが出来ないだろうかと
考えたのです。それが無理なら画像データの配列を取得して、自力でBitmapファイルを作るしかないかなと思っています。

何かやり方を間違えているのでしょうか?BitBltを使っても、表示されない部分のデータを保存出来るのでしょうか?

> 通常は、画像サイズのPictureBoxに表示させ、そのPictureBoxをスクロールさせるのでは。
画像サイズのPictureBoxっていうのは、そのままの意味でしょうか?

投稿時間:2007/05/11(Fri) 17:56
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^3: メモリDCからビットマップファイルに保存するには?
> そこで、メモリDC上にあるビットマップをそのままファイルに落とすことが出来ないだろうかと

メモリデバイスコンテキスト上のメモリビットマップは、PictureBox のサイズに
なっているのですか? それとも、最終的に出力する *.bmp ファイルの画像サイズですか?

もし、最終的に出力するサイズ大のメモリビットマップを用意できていないなら、
まずは CreateCompatibleBitmap で HBITMAP を作り、そこに描画する必要があるでしょう。

で、そのメモリビットマップへの描画が終わったのであれば、使用していた
メモリデバイスコンテキストから、そのメモリビットマップを取り外して(SelectObject)、
その後、描画した HBITMAP の画像データを、GetDIBits API を使ってバッファへコピー。

あとは Open ステートメントで、新規バイナリファイルを作成して、
BITMAPFILEHEADER 構造体を Put # して(オフセット値を間違えないように注意)、
BITMAPINFOHEADER 構造体を Put # して、最後に、先ほど GetDIBits で得た
バッファを Put # して、ファイルを Close すれば、bmp ファイルになるかと。


--- 追記 ---
もし、256色以下のファイルを作る場合は、BITMAPINFOHEADER の後に、パレットカラーとして
色数分の RGBQUAD 構造体を入れておいてください(フルカラー画像の場合は不要です)。
それから、作成した GDI オブジェクト(HDC, HBITMAP)の解放処理も忘れずに。

投稿時間:2007/05/15(Tue) 10:48
投稿者名:はやし
Eメール:
URL :
タイトル:
Re^4: メモリDCからビットマップファイルに保存するには?
魔界の仮面弁士さん、回答有難うございました。
問題が解決出来ました。