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と関連する良く見られている質問

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メソッドにもいろいろなやり方がありますので …

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

Qデバイス インポート の、意味を教えてほしいです

デバイス
インポート
の、意味を教えてほしいです

Aベストアンサー

デバイス…ハードウェア、部品、道具、等々、
インポート…輸入、取り込むこと、

ここ(ネット)で聞くならば、その前に(ネット)検索を。

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)

↓これ...続きを読む

QXPのデバイスマネージャでのこのメッセージの意味と解決策を教えてください。

今、WinXPで、
USBジョイスティックを三種類(スティック・スロットル・ラダー)を
接続しています。

起動の度に三つのうち二つのデバイスドライバを読み込めないので、
調べてみたらデバイスの詳細で下記のメッセージがありました。

"このハードウェアのデバイス ドライバの前のインスタンスがまだメモリ内にあるので、デバイス ドライバを読み込むことができません。 (コード 38)"

このメッセージの意味と、解決策についてご教示お願いいたします。

Aベストアンサー

 意味は、「すでにドライバが起動しているので二重起動は出来ません」ということでしょう。
 現状、残りの2つは使用できないのでしょうか。ためしに起動後に差し込んでやったり、別チャネルの USB バスにさしたり、ひとつのハブにひとつのジョイスティックをさすようにしてみてはいかがでしょうか。

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の中身を独立した関数にします。
たとえば、
...続きを読む

Qデバイスマネージャ「メモリ」「入出力」の意味

添付画像はWindows 8(64bit)のデバイスマネージャでメニュー「表示」→「リソース(種類別)」を選択した状態なのですが、この「メモリ」と「入出力」の違いが分かりません。
メモリの方は、メモリマップトIO用に各デバイスに割り当てられたアドレスでしょうか?
入出力の方は何を意味しているのでしょうか?

Aベストアンサー

メモリ:周辺機器がメモリへデータの読み書きを行うときに利用するアドレス
入出力:CPUと周辺機器がデータのやり取りをするとき、入出力するための
    ポートに付けられたアドレス

ここで表示されている数字の羅列は、左側が出力ポートで右側は入力ポートです。

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

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

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

Aベストアンサー

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

Q「USBデバイスが認識されません」とのメッセージの意味

デスクトップPCでUSBフラッシュメモリーを使用したいんですが差し込むと上記のようなメッセージが出ます。
デバイスの状態は「現在、このハードウェアデバイスはコンピューターに接続されていません」とのこと。
USBコントローラーのユニバーサルホストやルートパブもプロパティを見る限りデバイスは正常に動作していると出ています。
どうしたらまた使えるようになるんでしょうか?
昨夜までは使えました

Aベストアンサー

とりあえず再起動させてみる、

ハードウェアの追加ウィザードで追加してみる、

デバイスマネージャーでUSB関連を捨てて再起動し、
ドライバを再ロードさせてみる、

別のPCで認識状態の確認、
別PCでもダメならUSBメモリの破損という事も考えられます。

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ランキング