CScrollViewに表示している画像をビットマップに保存したいと思っております。
現在は、GDI+のImage:Saveで行っているのですが、思うように縮小が出来ません。
(Saveを行うためにMetafileにRectを渡すのですが、そこに100×100を渡すと、ビット
マップの座標が0からという理由だと思うのですが、101pixelのビットマップが出来てし
まいます。)
そのため、GDIの関数ではなく、
http://www.sm.rim.or.jp/~shishido/wincap.html
この辺を参考にさせていただきながら、ビットマップを生成してみようと思っておりま
す。
そこで、タイトルにも記載させていただいております
・範囲選択
・縮小
・モノクロ(BiCoountが1)
という処理はどのように行うべきでしょうか?
大体こんな流れで・・・という回答だけでも構いませんのでご教授お願いいたします。
ちなみに環境はWindowsXP(SP2)、VC++2005です。
言語の知識も正直初心者レベルです。
以上、よろしくお願いいたします。
ステップバイステップでやってみたらどうでしょう。
1.ウインドウをBMPにして保管してみて確認
2.上記を保管する前にStretchBlt()した結果を保管してみて確認
3.上記を保管する前にモノクロBMPを選択したDCにBitBltして保管
この手のは一つずつ進めた方がよいと思うので、とりあえず縮小まで。
・範囲選択
BitBltの引数で指定します
・縮小
BitBlt→StretchBltに変更します
まずはBitBlt/StretchBltのヘルプを読んでみて下さい。
さっそくのご回答ありがとうございますm(__)m
やはり全てをいきなりってのは無理ありますもんね・・・。
とりあえずビットマップのファイル保存を行ってみます・・・。
サンプルとかもしご存知でしたらご教授願います。
自分でも色々サンプルを探してみたんですが、「WINAPI WinMain」とか「LRESULT
CALLBACK WndProc 」とか使ってるものしか見当たらず(参考にして自分で作れと言われ
ればそれまでなんですが・・・)。
MFCを使ってよいならCImageが使えます。
SDKだけならBITMAPFILEHEADERから理解しなければなりませんし、
慣れてないと手間をくいます。
仲澤@失業者さん
本当に無知ですいませんが、
作成したいのは、CScrollViewに表示している画像のビットマップ保存です。
「MFCが使える」というのは、CScrollViewに表示している画像をCImageの関数などを使
用して縮小や保存処理が出来る、という事でしょうか?
(GDI+もCImageのsaveを使用しているので、出来れば保存処理はCImageではない方法で
行いたいです。)
意味分からない文章ですいません・・・。
中途半端な回答になっている理由は「画像のビットマップ」なるものが、
何であるのかトトさんの発言から読み取れないからです。
そのオブジェクトが保管できるかどうかは、何に「表示」しているかとは、
無関係ですよねぇ。はっきり言って「CScrollViewに表示している」
かどうかなんて、関係ないんです。
逆に、もしCScrollViewのクライアント領域を保管したいのなら、
ビットマップを選択しているDCを与えて、全描画関数を
コールするだけで、クライアント領域のBMPが取得でます。
その後の処理は本レスの一連の最初に戻るわけです。
画面に表示しているのはCADファイルです。(GDS2というストリームファイル)
そのファイルを読み込んで画面に描画しています。
>MFCを使ってよいならCImageが使えます。
という回答をいただいておりますが、質問に
>現在は、GDI+のImage:Saveで行っているのですが、思うように縮小が出来ません。
と記載させていただいております通り、CImageのSave関数ではビットマップ保存は出来
ても、思うように縮小が出来ない状態です。
>逆に、もしCScrollViewのクライアント領域を保管したいのなら、
>ビットマップを選択しているDCを与えて、全描画関数を
>コールするだけで、クライアント領域のBMPが取得でます。
この方法が記載されているホームページ等をご存知でしたら教えてくださいm(__)m
以下の話の意味が分からないです。
>(Saveを行うためにMetafileにRectを渡すのですが、
> そこに100×100を渡すと、ビットマップの座標が0から
> という理由だと思うのですが、101pixelのビットマップ
> が出来てしまいます。)
もう少し、詳しく教えていただけますか?
そこが伝わらないと、トトさんの期待する回答は出てこない気がします。
Metafile(
IN HDC referenceHdc,
IN const Rect & frameRect,
IN MetafileFrameUnit frameUnit = MetafileFrameUnitGdi,
IN EmfType type = EmfTypeEmfPlusDual,
IN const WCHAR * description = NULL
)
GDI+のメタファイルです。
このRectに図面の始点座標と幅・高さを格納します。
このとき、100×200pixelのビットマップを生成したくて
RectのWidthに100、Heightに200を格納しても、生成されるビットマップは101×201にな
ってしまうということです。
言葉が足りないでしょうか?
ちなみにソースはフリーのものです。
http://www.vector.co.jp/soft/winnt/business/se243021.html
いまいち理解できていないかもしれませんが、
ビットマップを保存する際のサイズがおかしいと言うだけなら、
Image:Save()の問題ではない気がします。
Metafile を介しているせいで、どこかでサイズが化けたのではないでしょうか?
Metafileを介さず、ビットマップを直接 Save()してしまうことをお勧めします。
CreateCompatibleBitmap()か何かしたビットマップがいますよね?
そのビットマップハンドルを、
Bitmap::Bitmap(HBITMAP, HPALETTE)
コンストラクタに渡して、
Image::Save()
を呼んでみてはどうでしょう?(BitmapはImageの派生クラス)
私はその方法でサイズ化けせずに保存できています。
>このとき、100×200pixelのビットマップを生成したくて
>RectのWidthに100、Heightに200を格納しても、生成されるビットマップは101×201に
な
>ってしまうということです。
おそらく、DCのグラフィックスモードが GM_ADVANCED になってるのでは
ないでしょうか。このモードでは矩形(RECT)の右端と、下端を「含む」ので、
そういうこともありえます。あんまり悩む必要もないかもしれません。
bunさん
>CreateCompatibleBitmap()か何かしたビットマップがいますよね?
>そのビットマップハンドルを、
> Bitmap::Bitmap(HBITMAP, HPALETTE)
>コンストラクタに渡して、
> Image::Save()
>を呼んでみてはどうでしょう?(BitmapはImageの派生クラス)
>私はその方法でサイズ化けせずに保存できています。
→CreateCompatibleBitmapしたビットマップはありますが
それをどうすれば良いのか分かりません・・・・
もし可能でしたら実際にソースコードで示していただけませんでしょうか?
仲澤@失業者さん
>おそらく、DCのグラフィックスモードが GM_ADVANCED になってるのでは
>ないでしょうか。このモードでは矩形(RECT)の右端と、下端を「含む」ので、
>そういうこともありえます。あんまり悩む必要もないかもしれません。
→SetGraphicsMode関数では「GM_COMPATIBLE」となっておりました。
CreateCompatibleBitmapしたビットマップがあるなら、
そのまま、
Bitmap::Bitmap(HBITMAP, HPALETTE)
に渡すだけですよ。
CBitmapはHBITMAPに自動変換されますので、
第一引数にそのまま渡すだけです。
第2引数はNULLでOKです。
そして、Save()を呼び出すだけ。
そこはすでにやってるみたいですから解説不要ですよね?
bunさん
えっと・・・
hBMP=CreateCompatibleBitmap(hdc,dwWidth,dwHeight);
で生成したビットマップ「hBMP」があります。
Bitmap::Bitmap(hBMP, NULL);
でいいんでしょうか???
それとも
CBitmap bmp = ::Bitmap(hBMP,NULL);
どういう風に記載するのか分かりません・・・orz
お助けを・・・