• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:実行結果をBMP形式で保存したい。)

MFCでの実行結果をBMP形式で保存する方法

このQ&Aのポイント
  • MFCのOnDrawで描画した実行結果をBMP形式で保存する方法についてアドバイスをいただきたいです。
  • BitBlt、CreateCompatibleDC、GetDCなどの関数を使用して実行結果を保存する方法について詳しく教えてください。
  • 初心者向けの参考書や指導者に相談すれば、MFCで実行結果をBMP形式で保存する方法がわかるかもしれません。アドバイスや紹介をお願いします。

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

  • ベストアンサー
  • flowergoo
  • ベストアンサー率38% (13/34)
回答No.1

出来てしまえば割と簡単ですが、道のりは近くないです。 私も以前書籍などを探し、akagenoanfanさんと同じような事で困っていた時期がありました。 実証済みの関数を上げさせていただきます 呼び出し部 SaveBitmap(this->m_CapDisp.m_hWnd, "TEST1.BMP"); // ビットマップの保存 ※引数1でCDC描画元のウインドウハンドルを渡します ※引数2でファイル名を渡します 関数部 //////////////////////////////////// // ビットマップファイルのファイル保存 // void SaveBitmap(HWND hWnd, LPCTSTR sFileName) { HANDLE hFile; HDC hDc, hDcBuf; LPBITMAPFILEHEADER lpHead; LPBITMAPINFOHEADER lpInfo; LPBYTE lpBuf, lpPixel; RECT cRect; HBITMAP hBmp, hOldBmp; DWORD nWriteSize, nFileSize, nWidth, nHeight, nLength; GetClientRect(hWnd, &cRect); // 画面サイズの取得 nWidth = cRect.right; //幅 nHeight = cRect.bottom; //高さ if( ( nWidth * 3 ) % 4 == 0 ) // ライン長を計算 nLength = nWidth * 3; else nLength = nWidth * 3 + ( 4 - ( nWidth * 3 ) % 4 ); // ファイルサイズの計算 nFileSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + nLength * nHeight; // 一時メモリの確保と各種情報のセット lpBuf = (LPBYTE)GlobalAlloc(GPTR, nFileSize); // バッファの確保 lpHead = (LPBITMAPFILEHEADER)lpBuf; // ファイルヘッダ情報 lpInfo = (LPBITMAPINFOHEADER)(lpBuf + sizeof(BITMAPFILEHEADER));//その他情報 lpPixel = lpBuf + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//ピクセルの取得 // ビットマップ情報のセット lpHead->bfType = 'M' * 256 + 'B'; lpHead->bfSize = nFileSize; lpHead->bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); lpInfo->biSize = sizeof(BITMAPINFOHEADER); lpInfo->biHeight = nHeight; lpInfo->biWidth = nWidth; lpInfo->biBitCount = 24; lpInfo->biPlanes = 1; // DCの取得とBMB情報のセット hDc = GetDC(hWnd); // DCの取得 hBmp = CreateCompatibleBitmap(hDc, nWidth, nHeight); // DC互換のBMPを作成 hDcBuf = CreateCompatibleDC( hDc ); // DC互換のDCバッファを作成 // BMBのコピー hOldBmp = (HBITMAP)SelectObject( hDcBuf, hBmp ); // 旧BMPの待避 BitBlt( hDcBuf, 0, 0, nWidth, nHeight, hDc, 0, 0, SRCCOPY ); // ビットマップのコピー SelectObject( hDcBuf, hOldBmp ); // 旧BMPの復元 GetDIBits( hDc, hBmp, 0, nHeight, lpPixel, (LPBITMAPINFO)lpInfo, DIB_RGB_COLORS ); hFile = CreateFile( sFileName, GENERIC_WRITE, 0, NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL ); if( hFile != INVALID_HANDLE_VALUE ) { WriteFile( hFile, lpBuf, nFileSize, &nWriteSize, NULL ); // ファイルへの書き込み CloseHandle( hFile ); } ReleaseDC( hWnd, hDc ); // DCの解放 DeleteObject( hBmp ); DeleteObject( hDcBuf ); GlobalFree( lpBuf ); } 以上です お試し下さい。

akagenoanfan
質問者

補足

引数1 に 何をいれればよいのか わかりません。。。 void CClTurnView::OnDraw(CDC* pDC) { CClTurnDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: この場所にネイティブ データ用の描画コードを追加します。 CPen Pen; CPen *pTmpPen; // 新しいペンやブラシを作るための変数です。 // クライアントの矩形領域内の中央の座標を求める。 CRect rect; GetClientRect(&rect); // 赤のペンを準備 Pen.CreatePen(PS_SOLID, 1, RGB( 255, 0, 0)); pTmpPen = pDC->SelectObject(&Pen); // X軸・Y軸を描画 pDC->MoveTo(rect.Width()/2,0); pDC->LineTo(rect.Width()/2,rect.Height() / 2*2); pDC->MoveTo(0,rect.Height() / 2); pDC->LineTo(rect.Width()/2*2,rect.Height() / 2); // 元のペンに戻す pDC->SelectObject(pTmpPen); Pen.DeleteObject(); SaveBitmap2(???????, "TEST1.BMP"); (略) }

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • flowergoo
  • ベストアンサー率38% (13/34)
回答No.2

#1の補足について 説明が足りなくて済みません。 引数1は描画元のウインドウハンドルを指定します。 ”CClTurnView”クラスであれば SaveBitmap2(this->m_hWnd, "TEST1.BMP"); となります

akagenoanfan
質問者

お礼

はい。実は最初そうしたのですが、文字が読み取れないという エラーが でて パニクッテしまったのです(恥ずかしいです。)。打ち直せば うまくいきました。 ほんとうに ありがとう ございました。 これで この問題は 解決しました。 感謝のかぎりです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • オブジェクトの削除について

    環境 WIN98 VC++6.0 MFC にて オブジェクトを使い終わってから削除している場合としていない場合が有るのですが、どうしてなのですか? 作ったオブジェクトはなんでもかんでも削除したほうが無難な気がしますが、本にのっているコードで削除してない場合も良く見かけます。 <削除していない>//著名な本のコード void Cxxx::OnDraw(CDC* pDC) {  CBitmap bmp;  bmp.LoadBitmap(nID);  略  //bmp.DeleteObject(); //■この記述が無い } <削除している>//ネット上でみかけたコード void CMainFrame::_SetBmp(CWnd* pBox,int nID,int  width,int height) // 単品 {  CDC* pDC=pBox->GetDC();  CDC memDC;  CBitmap bmp;  bmp.LoadBitmap(nID);  memDC.CreateCompatibleDC(pDC);  CBitmap* pOldBmp=memDC.SelectObject(&bmp);  pDC->BitBlt(0,0,width,height,&memDC,0,0,SRCCOPY);  memDC.SelectObject(pOldBmp);  bmp.DeleteObject();  memDC.DeleteDC(); }

  • デバイスコンテキストに書いた絵をBMPファイルに落としたいです。

    MFCを使っています。 OS:WINNT4.0 環境:VisialC++ CDCクラスのSetPixel,Bitbltなどの関数を使ってデバイスコンテキストに 書いた絵をBMPファイル(あるいはJPGなどの画像ファイル)として保存した いのですが、、、方法を教えてください。 よろしくお願いします。

  • MFCでウィンドウ枠をアニメーションさせたい

    こんにちは、VC++初心者です。 今MFCでデスクトップマスコットを作りたいと思っています。 MFCのSDIアプリでとりあえず作成している最中で、 BMP画像の表示はC***ViewクラスのOnDraw関数で表示させています。 問題はウィンドウ枠です。 スタイル指定をWS_POPUPにして、クライアント領域にのみ表示させていますが、 リージョンを使って、BMP画像を切り取った形のウィンドウにするのにてこずっています。 ちうか、そもそもOnDraw関数内でBMP表示とともに行っている、 SetWindowRgn関数がうまく動いてくれていない状態です(泣)。 ソースの一部をのせておきますで、どうかご判断ください。 宜しくお願いします。 CTestView::CTestView() { //コンストラクタでビットマップの読み込みとリージョンの設定 gazou.LoadBitmap( IDB_GAZOU); //CBitmapのメンバ変数 m_rgn[0].CreateEllipticRgn(0, 0, 48,48); //CRgnのメンバ変数1 m_rgn[1].CreateRectRgn(0, 0, 48,48); //CRgnのメンバ変数1 } void CTestView::OnDraw(CDC* pDC) { //画像表示及びリージョンの切り替え 中略... static int anim = 0; CDC dc; dc.CreateCompatibleDC( pDC); dc.SelectObject( gazou); pDC->BitBlt(0,0,48,48,&dc,0,0,SRCAND); //48*48ドットのBMP HRGN hrgn =(HRGN)m_rgn[anim].Detach(); SetWindowRgn( hrgn, true); dc.DeleteDC(); anim ^= 1; 中略... }

  • MFC VC++ 6.0 使用 

    class patchmodel{ double a; double b; private: void Draw(); } void patchmodel::Draw(){ CDC DC; CDC* dc = GetDC(); dc->TextOut((int)a,(int)b,"HELLO"); ReleaseDC( dc ); } と 実行してみたところ エラーがでます。 error C2660: 'GetDC' : 関数が不正な 0 個の実引数をともなって呼び出されました。 error C2660: 'ReleaseDC' : 関数が不正な 1 個の実引数をともなって呼び出されました。 CModel::OnDraw(CDC* pDC) を あえて使わずに 実行したいので このように 簡単なもので 試して見たのですが、うまくいきません。 GetDC の使い方を まちがえているのでしょうか? お返事ください。

  • 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); }

  • CDCオブジェクトの作成について

    // あまり意味はないのですが、 //CDCのオブジェクトを宣言して、 //そこへ図形を描画して、 //クライエント領域にBitBltするときは、 //どうすればいいですか? //CreateCompatibleDCが関係していると思っています。 //ですが、上手く描画できません。 //教えてください、 //お願いします。 void CProject1View::OnDraw(CDC* pDC) { CProject1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; ////////////////////////////////////////////////////// CDC imageDC; CPen pen,*oldpen; pen.CreatePen(PS_SOLID,3,RGB(255,0,0)); imageDC.CreateCompatibleDC(pDC); for(int i=0;i<100;i++) { for(int j=0;j<100;j++) { imageDC.SetPixel(i,j,RGB(128,0,0)); } } oldpen=imageDC.SelectObject(&pen); imageDC.Rectangle(50,50,400,300); pDC->BitBlt(0,0,600,600,&imageDC,0,0,SRCCOPY); imageDC.SelectObject(oldpen); ////////////////////////////////////////////////////// }

  • クリックした位置に画像を貼り付ける方法

    開発環境はWinXP、C++、MFCを使っています。 C++を勉強し始めた初心者です。 画面上で左クリックされた位置に画像(ビットマップ画像)を表示させる簡易プログラムを作ろうとしています。 ここで、マウスの位置を取得する方法がわかりません。理解しやすい方法があれば押してください。 ちなみにこんな感じでつくってます。。。↓ void Canvas::MakeStamp() //Canvas ・MaskStamp共に任意の名前 { // //ここでマウスの位置を取得したいです // //画像を貼り付け CClientDC cdc(this); CDC bmpCDC; bmpCDC.CreateCompatibleDC(&cdc); CBitmap bmp; bmp.LoadBitmap(STAMP); //STAMPは任意の名前 bmpCDC.SelectObject(bmp); cdc.BitBlt(X,Y,60,60,&bmpCDC,0,0,SRCCOPY); //ここのX,Yはクリックした座標を当てはめるつもりです。 } よろしくお願いします。

  • MFCで画像を表示させているのですが、透過表示する方法がわかりません。

    VC2005のMFCで画像を表示させているのですが、透過表示する方法がわかりません。 OnDraw(CDC* pDC) で、#include <atlimage.h>として、 CImage img; img.Load( "test.gif" ); CDC* pDCImg = CDC::FromHandle( img.GetDC() ); pDC->BitBlt( 60, 10, img.GetWidth(), img.GetHeight(), pDCImg, 0, 0, SRCCOPY ); img.ReleaseDC(); すればGIF画像が表示されましたが、このGIG画像は透過GIFですが そのまま表示されているので、背景が黒の場合透、明部分の白が見えて 四角い枠の画像となります。 GIF透過ファイルの場合、そのまま透過になる方法や、何か手段を用いて透過をさせたいです。

  • 画像の印刷について

    環境はWIN98 VC++6.0 MFCです。 初めて印刷に挑戦します。 TextOut()で書いた文字は印刷プレビューでちゃんと表示されましたが、以下のようにして取りこんだ画像を印刷プレビューで見ても何も表示されません。 どうしたら印刷できるようになりますか? void CXxxView::OnDraw(CDC* pDC) { CXxxDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: この場所にネイティブ データ用の描画コードを追加します。 CDC myDC; CBitmap myBMP; myBMP.LoadBitmap(IDB_BITMAP3); myDC.CreateCompatibleDC(pDC); CBitmap* oldBMP=myDC.SelectObject(&myBMP); pDC->BitBlt(10,10,60,100,&myDC,0,0,SRCCOPY); myDC.SelectObject(oldBMP); }

  • mfcの画像表示で、bmp表示がよくわかりません

    mfcの画像表示で、bmp表示がよくわかりません。 特に、SelectObject()でBitmapを戻す等が特によくわかりません。 今までは、そういうもんだとしてきたのですが、放っておけない事態になりまして、 相談させて下さい。 (1)下記のbmpDC.SelectObject(oldbmp)等について、その仕組みを詳細に紹介しているHPを ご存じでしたらお教えください。 (2)下記プログラムの画像の扱いで、まずい部分を、おかしいなと思われた部分をお教えください。  動作は、問題なく動作しています。BITMAPを敷き詰めるプログラムです。 CArray<HBITMAP> hBitAry; (HBITMAPを配列にしているまずさは今回は除外して下さい。) … int topX=-100-5; int topY=0; int hLen=100; int wLen=100; int yoko=0; CDC *pDC=mPict.GetDC(); for(int i=0; i<hBitAry.GetCount(); i++) { CDC bmpDC; bmpDC.CreateCompatibleDC(pDC); CBitmap *pBitmap=CBitmap::FromHandle(hBitAry.GetAt(i)); BITMAP BMP; pBitmap->GetBitmap(&BMP); CBitmap *oldbmp=bmpDC.SelectObject(pBitmap); if(yoko<3) { topX+=100+5; yoko++; } else { topX=0; topY+=100+5; yoko=0; } pDC->SetStretchBltMode(COLORONCOLOR); pDC->StretchBlt(topX,topY,100,100,&bmpDC,0,0,BMP.bmWidth,BMP.bmHeight,SRCCOPY); bmpDC.SelectObject(oldbmp); ::DeleteObject(CBitmap::FromHandle(hBitAry.GetAt(i))); } ReleaseDC(pDC); どうぞよろしくお願い致します。

最近の不思議な現象
このQ&Aのポイント
  • 最近の授業中に思ったことが現実になる不思議な現象についてまとめました。
  • 私が最近経験した不思議な現象についてお伝えします。
  • 授業中にふと思ったことが現実で起こる不思議な現象についてご紹介します。
回答を見る

専門家に質問してみよう