MFCを使っています。
OS:WINNT4.0
環境:VisialC++

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

A 回答 (2件)

だいぶ遅いですけど、一応、、、



#include<atlimage.h>
void CProject2View::OnLButtonDown(UINT nFlags, CPoint point)
{
CImage image;
image.Load("000.jpg");
CDC *imageDC;
imageDC=CDC::FromHandle(image.GetDC());
CDC *pdc=GetDC();
pdc->BitBlt(0,0,image.GetWidth(),image.GetHeight(),imageDC,0,0,SRCCOPY);
pdc->TextOut(0,0,"Sample");
CDC *SaveImageDC;
CImage SaveImage;
SaveImage.Create(image.GetWidth(),image.GetHeight(),24,0);
SaveImageDC=CDC::FromHandle(SaveImage.GetDC());
SaveImageDC->BitBlt(0,0,image.GetWidth(),image.GetHeight(),pdc,0,0,SRCCOPY);
SaveImage.Save("dat.jpg");
ReleaseDC(imageDC);
ReleaseDC(pdc);
ReleaseDC(SaveImageDC);
CView::OnLButtonDown(nFlags, point);
}
    • good
    • 2

CFileDialog::CFileDialog


を使えば、保存できるのではないでしょうか?

この回答への補足

???
CFileDialog::CFileDialogでどうやってデバイスコンテキストの内容を
BMPファイルに落とします?

補足日時:2001/06/18 12:46
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qbmp→jpgに、jpg→bmpに

bmpの画像や、jpgの画像の情報を交換して(例:bmpをjpgに変換したり、jpgの画像情報をbmpに変換)て、できますか??
拡張子を書き換える方法からbmp→jpg,jpg→bmpに変換する方法はわかりました。画像情報を交換するプロパティてありますか??

画像情報を変換する右方てありますか??適切なアドバイスくれたらうれしいです。

Aベストアンサー

Image^ imgBMP = Bitmap::FromFile( "bmpファイルパス" );
imgBMP->Save("jpgファイルパス");

Image^ imgJPG = Bitmap::FromFile( "jpgファイル名")
imgJPG->Save("bmpファイルパス");

といった具合でしょう
System.Drawing.ImageクラスのメソッドをMSDNなどで確認しましょう
Saveメソッドにもいろいろなやり方がありますので …

# 開発環境の情報などは最初の質問時に書きましょう

QMFC デバイスコンテキストについて

MFCのデバイスコンテキストを取得して、DirectXなどで描画を行っています。
環境は、
VS2008
DirextX 9.0
MDIなんですがOnInitDialogでDirectXのデバイスを取得しています。
次にOnDrawで描画を行っています。
GetDcでコンテキストを取得し、円の描画を行っています。

MDIですので、5以上のファイルを作成すると、描画が行われなくなります。

共通デバイスコンテキストは、5以上持てないということは検索して分かったのですが、5以上のファイルに描画を成功させるためには、どうすればいいのでしょうか?

・単純に新規ファイルを作ったときに、以前に作ったファイルのデバイスコンテキストを開放また、Directxのデバイスを開放すればいい?

・DirectXのデバイスをファイルごとに作成するのではなく、共通してもてば解決できる??

・そもそも解放したりしても無理??

と考えているのですが、どうでしょうか?
助言をお願いします。

Aベストアンサー

 補足頂きました。
 言葉足らずでした。多重継承をしている訳ではありません。
 DirectXと言う構造体の中にアプリ内で共有するデータをstaticメンバ変数として入れておき、全員でそれを利用しているだけです。要するにグローバル変数の様なものです。
 アプリ内で共有するデータの作り方は、その人の考え方次第と言う事に成ります。

 staticメンバ変数・関数の書式に馴染みが無ければ、以下を参考にすると良いです。
 http://ja.wikipedia.org/wiki/%E4%BA%88%E7%B4%84%E8%AA%9E_(C%2B%2B)

↓これを書き忘れていました。継承する訳ではありません。
struct DirectX
{
template<class _Tp>static BOOL ReleaseCOM(_Tp& p)
{
if(p == NULL)
return FALSE;

HRESULT hResult = p->Release();
p = NULL;
return hResult == S_OK;
}
static BOOL Init(HWND hWnd);
static BOOL UnInit();
static LPDIRECT3D9 g_pD3DPlan;//staticメンバ
static LPDIRECT3DDEVICE9 g_pDEVPlan;//staticメンバ
};

 例えば、

struct DirectX
{
LPDIRECT3D9 pD3DPlan;
LPDIRECT3DDEVICE9 pDEVPlan;
};

extern DirectX g_dx;//此れを全員で使う

 でも構いません。要はグローバル変数を一箇所にまとめようとしているような物です。
 ただ、C++ではextern変数自体、余り使われないようです・・・。

 補足頂きました。
 言葉足らずでした。多重継承をしている訳ではありません。
 DirectXと言う構造体の中にアプリ内で共有するデータをstaticメンバ変数として入れておき、全員でそれを利用しているだけです。要するにグローバル変数の様なものです。
 アプリ内で共有するデータの作り方は、その人の考え方次第と言う事に成ります。

 staticメンバ変数・関数の書式に馴染みが無ければ、以下を参考にすると良いです。
 http://ja.wikipedia.org/wiki/%E4%BA%88%E7%B4%84%E8%AA%9E_(C%2B%2B)

↓これ...続きを読む

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

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

Aベストアンサー

デバイスコンテキストの仕組みを理解する必要があります。

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

デバイスコンテキストの仕組みを理解する必要があります。

OnDrawでは、「ディスプレイ」というデバイスに対して、描画していると思います。これは、出力するデバイスを「プリンタ」にすれば、プリンタに出力することもできます。

同じように、「メモリ」に出力すれば、メモリ上に画像データが出力されますので、これをファイルに保存すればいいわけです。メモリデバイスコンテキストは、CreateCompatibleDC という関数を使うと作成できます。

まず、OnPaintの中身を独立した関数にします。
たとえば、
...続きを読む

QWindowsプログラミング:BitBltで半透明な透かしを作りたい

Windowsプログラミング:BitBltで半透明な透かしを作りたい

現在透過色を設定して、特定の部分をくりぬく処理はできているのですが、「くりぬいて残った部分をさらに半透明にして描画」という処理がWindowsAPIで実現できなくて困っております。
ご存知の方居られましたらご教授願えれば幸いです。

Aベストアンサー

AlphaBlend関数を使用するとできます。
例えば以下のサイトを参考にしてください
http://www3.pf-x.net/~chopper/home2/WinAPI/WinGDI19.html

Qピクチャーコントロールのデバイスコンテキストを取得するためには?

VC2005についてです

ピクチャーコントロールのデバイスコンテキストを取得するためには
どうすればよいでしょうか?

MDIGetActive()->GetDC()->TextOutA(20,50,"文字列です");

この様にすれば、アクティブになった
子ウィンドウデバイスコンテキストを取得することができますが、

アクティブになった、この子ウィンドウの上にある
ピクチャーコントロールに
描画するためには どうすればよいでしょうか?

MDIで、複数のウィンドウのうちで
アクティブになった ものだけを
操作したいのです。

よろしくお願いします。

Aベストアンサー

GetDlgItemを使ってピクチャーコントロールのCWndのポインターを取得しましょう

ピクチャーコントロールのリソースIDが分かっているなら
CWnd* pWndChild = MDIGetActive();
// リソースIDが IDC_PICTURE1なら
CWnd* pWndPict = pWndChild->GetDlgItem( IDC_PICTURE1 );
といった具合で pWndPictを取得して
CDC* pDC = pWndPict->GetDC();
pDC->TextOutA( 20, 50, "文字列です");
pWndPict->ReleaseDC( pDC );
とった具合にします


このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング

おすすめ情報