ウィンドウのビットマップ保存(範囲選択し、縮小してさらにモノクロ変換) – プログラミング – Home

ウィンドウのビットマップ保存(範囲選択...
 
通知
すべてクリア

ウィンドウのビットマップ保存(範囲選択し、縮小してさらにモノクロ変換)

固定ページ 1 / 2

トト
 トト
(@トト)
ゲスト
結合: 20年前
投稿: 11
Topic starter  

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です。

言語の知識も正直初心者レベルです。

以上、よろしくお願いいたします。


引用解決済
トピックタグ
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

ステップバイステップでやってみたらどうでしょう。
1.ウインドウをBMPにして保管してみて確認
2.上記を保管する前にStretchBlt()した結果を保管してみて確認
3.上記を保管する前にモノクロBMPを選択したDCにBitBltして保管


返信引用
みい
 みい
(@みい)
ゲスト
結合: 22年前
投稿: 65
 

この手のは一つずつ進めた方がよいと思うので、とりあえず縮小まで。
・範囲選択
BitBltの引数で指定します
・縮小
BitBlt→StretchBltに変更します
まずはBitBlt/StretchBltのヘルプを読んでみて下さい。


返信引用
トト
 トト
(@トト)
ゲスト
結合: 20年前
投稿: 11
Topic starter  

さっそくのご回答ありがとうございますm(__)m

やはり全てをいきなりってのは無理ありますもんね・・・。
とりあえずビットマップのファイル保存を行ってみます・・・。
サンプルとかもしご存知でしたらご教授願います。

自分でも色々サンプルを探してみたんですが、「WINAPI WinMain」とか「LRESULT
CALLBACK WndProc 」とか使ってるものしか見当たらず(参考にして自分で作れと言われ
ればそれまでなんですが・・・)。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

MFCを使ってよいならCImageが使えます。
SDKだけならBITMAPFILEHEADERから理解しなければなりませんし、
慣れてないと手間をくいます。


返信引用
トト
 トト
(@トト)
ゲスト
結合: 20年前
投稿: 11
Topic starter  

仲澤@失業者さん

本当に無知ですいませんが、
作成したいのは、CScrollViewに表示している画像のビットマップ保存です。

「MFCが使える」というのは、CScrollViewに表示している画像をCImageの関数などを使
用して縮小や保存処理が出来る、という事でしょうか?

(GDI+もCImageのsaveを使用しているので、出来れば保存処理はCImageではない方法で
行いたいです。)

意味分からない文章ですいません・・・。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

中途半端な回答になっている理由は「画像のビットマップ」なるものが、
何であるのかトトさんの発言から読み取れないからです。
そのオブジェクトが保管できるかどうかは、何に「表示」しているかとは、
無関係ですよねぇ。はっきり言って「CScrollViewに表示している」
かどうかなんて、関係ないんです。

逆に、もしCScrollViewのクライアント領域を保管したいのなら、
ビットマップを選択しているDCを与えて、全描画関数を
コールするだけで、クライアント領域のBMPが取得でます。

その後の処理は本レスの一連の最初に戻るわけです。


返信引用
トト
 トト
(@トト)
ゲスト
結合: 20年前
投稿: 11
Topic starter  

画面に表示しているのはCADファイルです。(GDS2というストリームファイル)
そのファイルを読み込んで画面に描画しています。

>MFCを使ってよいならCImageが使えます。
という回答をいただいておりますが、質問に

>現在は、GDI+のImage:Saveで行っているのですが、思うように縮小が出来ません。
と記載させていただいております通り、CImageのSave関数ではビットマップ保存は出来
ても、思うように縮小が出来ない状態です。

>逆に、もしCScrollViewのクライアント領域を保管したいのなら、
>ビットマップを選択しているDCを与えて、全描画関数を
>コールするだけで、クライアント領域のBMPが取得でます。
この方法が記載されているホームページ等をご存知でしたら教えてくださいm(__)m


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

以下の話の意味が分からないです。
>(Saveを行うためにMetafileにRectを渡すのですが、
> そこに100×100を渡すと、ビットマップの座標が0から
> という理由だと思うのですが、101pixelのビットマップ
> が出来てしまいます。)
もう少し、詳しく教えていただけますか?

そこが伝わらないと、トトさんの期待する回答は出てこない気がします。


返信引用
トト
 トト
(@トト)
ゲスト
結合: 20年前
投稿: 11
Topic starter  

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


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

いまいち理解できていないかもしれませんが、
ビットマップを保存する際のサイズがおかしいと言うだけなら、
Image:Save()の問題ではない気がします。

Metafile を介しているせいで、どこかでサイズが化けたのではないでしょうか?

Metafileを介さず、ビットマップを直接 Save()してしまうことをお勧めします。
CreateCompatibleBitmap()か何かしたビットマップがいますよね?
そのビットマップハンドルを、
Bitmap::Bitmap(HBITMAP, HPALETTE)
コンストラクタに渡して、
Image::Save()
を呼んでみてはどうでしょう?(BitmapはImageの派生クラス)

私はその方法でサイズ化けせずに保存できています。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

>このとき、100×200pixelのビットマップを生成したくて
>RectのWidthに100、Heightに200を格納しても、生成されるビットマップは101×201に

>ってしまうということです。

おそらく、DCのグラフィックスモードが GM_ADVANCED になってるのでは
ないでしょうか。このモードでは矩形(RECT)の右端と、下端を「含む」ので、
そういうこともありえます。あんまり悩む必要もないかもしれません。


返信引用
ビギナー
 ビギナー
(@ビギナー)
ゲスト
結合: 24年前
投稿: 8
 

bunさん
>CreateCompatibleBitmap()か何かしたビットマップがいますよね?
>そのビットマップハンドルを、
> Bitmap::Bitmap(HBITMAP, HPALETTE)
>コンストラクタに渡して、
> Image::Save()
>を呼んでみてはどうでしょう?(BitmapはImageの派生クラス)

>私はその方法でサイズ化けせずに保存できています。
→CreateCompatibleBitmapしたビットマップはありますが
 それをどうすれば良いのか分かりません・・・・
 もし可能でしたら実際にソースコードで示していただけませんでしょうか?

仲澤@失業者さん

>おそらく、DCのグラフィックスモードが GM_ADVANCED になってるのでは
>ないでしょうか。このモードでは矩形(RECT)の右端と、下端を「含む」ので、
>そういうこともありえます。あんまり悩む必要もないかもしれません。
→SetGraphicsMode関数では「GM_COMPATIBLE」となっておりました。


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

CreateCompatibleBitmapしたビットマップがあるなら、
そのまま、
 Bitmap::Bitmap(HBITMAP, HPALETTE)
に渡すだけですよ。

CBitmapはHBITMAPに自動変換されますので、
第一引数にそのまま渡すだけです。
第2引数はNULLでOKです。

そして、Save()を呼び出すだけ。
そこはすでにやってるみたいですから解説不要ですよね?


返信引用
ビギナー
 ビギナー
(@ビギナー)
ゲスト
結合: 24年前
投稿: 8
 

bunさん

えっと・・・

hBMP=CreateCompatibleBitmap(hdc,dwWidth,dwHeight);

で生成したビットマップ「hBMP」があります。

Bitmap::Bitmap(hBMP, NULL);
でいいんでしょうか???
それとも
CBitmap bmp = ::Bitmap(hBMP,NULL);

どういう風に記載するのか分かりません・・・orz
お助けを・・・


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

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