• ベストアンサー

MFC VC++ 6.0 使用 OnDrawでPolygonを使って書いた実行結果をBMPファイルとして保存したいのですが。

OnDrawでPolygonを使って書いた実行結果をBMPファイルとして保存したいのですが、どこをさわっていいのか全くわかりません。どなたか 簡単なアドバイスいただけないでしょうか?参考書等の紹介などもありがたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • nim05
  • ベストアンサー率61% (111/181)
回答No.1

デバイスコンテキストの仕組みを理解する必要があります。 OnDrawでは、「ディスプレイ」というデバイスに対して、描画していると思います。これは、出力するデバイスを「プリンタ」にすれば、プリンタに出力することもできます。 同じように、「メモリ」に出力すれば、メモリ上に画像データが出力されますので、これをファイルに保存すればいいわけです。メモリデバイスコンテキストは、CreateCompatibleDC という関数を使うと作成できます。 まず、OnPaintの中身を独立した関数にします。 たとえば、 CMyWnd::Draw( CDC *pDC ) { pDC->Polygon  みたいな感じ } で、OnDrawのときは、この関数に、OnDrawのDCを渡してあげます。 ファイルに保存するときは、メモリデバイスコンテキストをわたしてあげます。 これで、画面に描画したものと同じ画像がメモリに格納されます。 ところが!困ったことにこのメモリに格納された画像は、DDB(デバイス依存ビットマップ)と呼ばれる形式です。BMPファイルは、DIB(デバイス独立ビットマップ)という形式なので、DDB→DIB変換が必要になります。 これ以上は、説明が大変なので調べて見てください。 ヒントとして、DIBSECTIONという仕組みを調べてください。DDBとDIBを同じように扱えます。 DIBSECTIONの使い方はいろいろ情報がありますので、頑張ってください。 http://www.hcn.zaq.ne.jp/no-ji/reseach/990124.htm

akagenoanfan
質問者

お礼

ありがとうございます。とっかかりが みつかり 大変ありがたいです。DIBSECTION というので 検索したら いろいろ 役にたちそうな 情報が でてきました。すこし それで がんばってみます。また いろいろ 質問 を gooでさせていただくとおもいますが、そのときは よろしくおねがいします。

その他の回答 (1)

  • nim05
  • ベストアンサー率61% (111/181)
回答No.2

連続書込みで失礼します。 もう一つ方法がありました。 GDI+ というモジュールを使います。 使い方は、↓を見れば一発です。 http://park17.wakwak.com/~dragoon/gdiplus1.htm VC6の場合、開発環境を整えるまでに時間がかかりますが、一度セットしてしまえばあとは簡単です。 ただし、WindowsXP 以外で使用する場合、GdiPlus.dllをプログラムフォルダにコピーしておく必要があります。 GDI+は、GDIでさんざんプログラマーから文句を言われたところを直したしくみですので、今までの苦労はなんだったんだ、というくらいに簡単です。

関連するQ&A

  • 実行結果をBMP形式で保存したい。

    なかなか うまくいきません。 C::OnDraw {  略 CDC->Polygon(///  略 } このように MFC のOnDraw でかいた 実行結果を BMP形式 で 保存したいのですが。。 BitBlt CreateCompatibleDC GetDC などの いろいろな 関数がありますが、いったい何をどうつかえばいいのか わかりません。ほんとに 初歩的段階で もうしわけないのですが、、どなたか アドバイスいただけないでしょうか?手取りあしとり指導してくれるから(これが 死ぬほどたすかるのですが・・)、この参考書をみれば やりかたが 乗っている(これも たすかる)と紹介してくれるかた、 等々 どんな ことでも いいので 教えてください。先が遠すぎてこまっています

  • プログラムで文字をBMPファイルに書き、その結果をBMPファイル形式で

    プログラムで文字をBMPファイルに書き、その結果をBMPファイル形式で保存するやり方を教えてください。 Microsoft Visual C++ 6.0を使用しています。 よろしくお願いします。

  • VC#での24ビットbmp形式での保存方法

    VC#でbmpファイルで保存する場合、以下のようにImageFormat.Bmpとすると思いますが、これだと32ビットbmp形式で出力されます。 24ビットbmpで出力する方法はないでしょうか? if (saveFileDialog1.ShowDialog() == DialogResult.OK) { pb1.Image.Save(saveFileDialog1.FileName,ImageFormat.Bmp); }

  • OnDraw以外でクライアント領域をBMPに保存できない

    いつもお世話になっています。 MFCでシミュレーション計算プログラムを作っていて クライアント領域の画像をBMPファイルに落とすため 下記サブルーチンを作成しましたが、 ファイルができません。 OnDraw関数に記述すると、 最初の1ステップ目のみファイルが出力されます??? どなたかアドバイス・参考URL等ご教示お願い致します。 また、他に有用なライブラリ等ありましたら、 URL等ご紹介いただければありがたいです。 void CMPSView::SaveBMP(HWND hwnd, char* filename) { DWORD dwSize,dwFSize,dwWidth,dwHeight,dwLength; HANDLE fh; LPBITMAPFILEHEADER lpHead; LPBITMAPINFOHEADER lpInfo; LPBYTE lpBuf,lpPixel; RECT rec; HDC hdc,hdcMem; HBITMAP hBMP,hOld; (中略:バッファ確保、ヘッダ作成) hdc = this->GetDC()->m_hDC; hBMP=CreateCompatibleBitmap(hdc,dwWidth,dwHeight); hdcMem=CreateCompatibleDC(hdc); hOld=(HBITMAP)SelectObject(hdcMem,hBMP); BitBlt(hdcMem,0,0,dwWidth,dwHeight,hdc,0,0,SRCCOPY); SelectObject(hdcMem,hOld); GetDIBits(hdc,hBMP,0,dwHeight,lpPixel,(LPBITMAPINFO)lpInfo,DIB_RGB_COLORS); ReleaseDC(this->GetDC()); DeleteObject(hBMP); DeleteObject(hdcMem); fh=CreateFile(filename, GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); WriteFile(fh,lpBuf,dwFSize,&dwSize,NULL); CloseHandle(fh); GlobalFree(lpBuf); }

  • CGIを実行した結果をファイルに保存したい。

    クライアント側からCGIを実行してサーバーから戻って来た実行結果データをクライアント側でバッチorスクリプト処理で保存したいのですが保存する手段がありましたらご助力ください。

    • 締切済み
    • CGI
  • 一時ファイルなどを削除しても保存形式が「bmp」になります。

    パソコンA(WinXP)でスキャンした画像をメールに添付して送り、パソコンB(Win98E)からメールを開いて画像を保存しようとしました。 保存形式は「jpg」なのですが、いざ【名前を付けて画像を保存】をクリックすると保存形式が「bmp」のみになってしまいます。 「ツール」→「インターネットオプション」→「ファイルの削除」&「履歴のクリア」を実行しても、 「設定」→「オブジェクトの表示」&「ファイルの表示」を削除しても、保存形式は「bmp」のままです。 「Temporary Internet Files」も削除しました。 他に、何か削除するものはあるのでしょうか? 画像を「jpg」として保存できるようになる方法などございますでしょうか? なるべく専用ソフトは利用せずに・・・と思っております。

  • 一時ファイル消去してもbmpでしか保存できない…

    サイト上の画像などををjpgで保存したいんですが、 bmpしか選択できないためjpgで保存できません。 自分が記憶している限り、たぶん今までずっと「名前をつけて画像を保存」ではbmpしか選択できませんでした。 他の質問でよく見かける解決方法の一時ファイル、履歴の削除をしてみましたが状況は変わりません。 ほかにどのような原因が考えられるでしょうか? 教えてください、おねがいします。

  • GIFのファイルを保存するとBMPになってしまう

    WIN2000を使っています。 フリー素材のページからGIFファイルを右クリックで保存したところ、どの画像も拡張子が「BMP」になってしまいます。 先日までは、GIFとして保存もできていました。 特に設定をいじった記憶もなく、なにをどおしたらよいのかわかりません。 どなたかご教授ください。 ちなみにメールで添付して、自分宛に送信するとちゃんとGIF(アニメ)のファイルとして添付されてました。

  • BMPファイルを作成し保存

    教えてください。 環境:VB6 sp5 winXP sp2 行いたいこと(アウトプット):BMPファイルを作成して、HDDなどに保存したいです。 入力情報(インプット):VBコード内で配列としてピクセル情報を持っています。1000*1000の画像で、変数ImageData(1000000)の中に256階調でデータが入っています。 配列内のデータを元に1枚の画像(bmp形式)を作成これを保存したいです。 わかるかた、教えてください。 サンプルコードなどの場所などを添付していただければ幸いです。 よろしくお願いします。 質問の意味がわからなければ、お知らせください、追記します。

  • ファイルの保存ではなく実行したいのに・・・

    ダウンロードのところをクリックすると、通常「上記の場所から実行」と「ファイルを保存」の選択ができるかとおもうのですが、クリックをすると保存画面が表示され実行ができません。 ちなみにIE6.0をインストールしており、IE5.5のPCでは正常にウィンドウが表示されます。 セキュリティなどの確認もしたのですが、変わりません。 どうか教えてください。