Re: DXライブラリで描画したマップを画像ファイルに出力したい ( No.1 ) |
- 名前:B.E 日時:2019/11/08 22:10
リファレンスには載ってないですが、描画中の画面を画像ファイルとして保存できる下記の関数があるみたいです。
int SaveDrawScreenToBMP( int x1, int y1, int x2, int y2, const TCHAR *FileName );
int SaveDrawScreenToPNG( int x1, int y1, int x2, int y2, const TCHAR *FileName, int Quality = 80 , int Sample2x1 = TRUE);
int SaveDrawScreenToJPEG(int x1, int y1, int x2, int y2, const TCHAR *FileName, int CompressionLevel = -1);
(他にメモリ上のデータを画像保存する関数もありますが、そっち使うのは結構手間だと思うので省きました。)
使い方は引数みれば大体分かると思います。(左上座標、右下座標、ファイル名まで書けば後の圧縮設定の引数は省略も可です。)
で全体マップの保存ですが、MakeScreen()関数で全体マップサイズのスクリーンを作り、
描画対象にして、そこにマップ全体を描画してそのまま保存すれば出来ると思います。
ただ、上のやり方は結構時間がかかる処理なのでゲームプレイ中のバックグラウンドで処理したい場合は無理があると思います。
とくに大きいサイズの画像を圧縮保存するのは時間をとられます。
(SaveDrawScreenTo系が非同期書き出しに対応してるかは調べてないので不明です。すいません。)
あと、あまりに全体マップのサイズが大きいとグラボの性能にもよりますがMakeScreen()がエラーになるかもしれません。
|
Re: DXライブラリで描画したマップを画像ファイルに出力したい ( No.2 ) |
- 名前:田中一郎 日時:2019/11/09 16:46
回答ありがとうございます。
リファレンスに載っていない関数がある事は今までの質問と回答を読んでいたら薄々気づいていたのですが
自分がその関数を使う事になって、改めて意識しました。
SaveDrawScreenToBMP()なんて関数は把握してなかったです。
この関数とMakeScreen()を使えば出来るとは思いもしませんでした。
関数の仕様の把握とプログラムの構築に手間取っていますが、恐らく出来ると思います。
プログラムが完成するまでに時間がかかると思ったので、一旦返信だけしておきます。
|
Re: DXライブラリで描画したマップを画像ファイルに出力したい ( No.3 ) |
- 名前:田中一郎 日時:2019/11/10 17:46
色々試してみたのですが、0×0から640×480までの範囲までしか記録できませんでした。
使用する最大のマップ画像が3808×3264なので
handle=MakeScreen(3808,3264,TRUE)としてやってみたのですが、どうしても(640,480)までしか画像ファイルに出力できませんでした。
またSaveDrawScreenToBMP()で640×480より大きい値を指定すると、ファイル自体出力されないです。
DrawExtendGraph(0,0,640,480,handle,TRUE);とするとhandleに描画されている画像が640×480まで縮小されるのかと思ったのですが、
ファイルに描画される大きさは変化無しで、最大3808×3264の内の640×480までしか出力されませんでした。
|
Re: DXライブラリで描画したマップを画像ファイルに出力したい ( No.4 ) |
- 名前:Tir 日時:2019/11/10 19:37
マップを描画する際とSaveDrawScreen等の関数を実行するときにSetDrawScreenで描画対象をhandleに変えていますか?
|
Re: DXライブラリで描画したマップを画像ファイルに出力したい ( No.5 ) |
- 名前:B.E 日時:2019/11/10 20:51
コードが無いのでなんとも言えませんが、考えられる理由として、Tirさんの言うようにSetDrawScreen()が抜けてて、
前に指定した描画先画面(デフォルトならDX_SCREEN_FRONT)に描画して画像保存しちゃってるとかですかね…。
SaveDrawScreenTo系の関数は現在の描画先が保存されるのでSetDrawScreen()で指定しないといけません。
もしそれが原因な場合、前の書き込みで描画対象にしてとしか書かなかったんで、分かりづらかったのならすいません。
一応自分の環境ではこんな感じにすれば3808×3264サイズでBMPもPNGもJPEGも保存できます。
(SetDrawScreen()の後にマップを描画してください。あとエラー処理は省略してあります。)
int MapMaxSizeX = 3808; //全体マップ横サイズ
int MapMaxSizeY = 3264; //全体マップ縦サイズ
int SaveScreenH = MakeScreen(MapMaxSizeX, MapMaxSizeY, FALSE); //保存用スクリーン作成
SetDrawScreen(SaveScreenH); //保存用スクリーンを描画先にする
//ここに全体マップ描画処理を書く
SaveDrawScreenToBMP(0, 0, MapMaxSizeX, MapMaxSizeY, "MapSaveTest.BMP");//BMP保存
SaveDrawScreenToPNG(0, 0, MapMaxSizeX, MapMaxSizeY, "MapSaveTest.PNG",-1);//PNG保存
SaveDrawScreenToJPEG(0, 0, MapMaxSizeX, MapMaxSizeY, "MapSaveTest.JPG",80, TRUE);//JPG保存
//すいません、前の書き込みToPNGとToJPEGの引数逆になってました。上記の引数があってます。
SetDrawScreen(DX_SCREEN_BACK); //裏画面を描画先に戻す
DeleteGraph(SaveScreenH); //保存用スクリーンの後始末
上のコードで保存できない場合は、グラボとかの環境が原因かもしれません…。
MakeScreen()が失敗するとグラフィックハンドルではなくてエラーが帰って来て、
そのエラー値をSetDrawScreen()で指定してもさらにエラーになり、描画先が変わりません。
なので結果的に前に指定した描画先(デフォルトならDX_SCREEN_FRONT)に描画して画像保存されちゃいます。
上のコードにMakeScreen()の戻り値をチェックする処理を追加して、何度やってもエラーが帰ってくるようなら、
おそらくグラボの限界でハードウェア的な問題だと思うのでプログラムからは対処のしようがないかもしれません…。
(あるとしたら分割で書き出してペイントソフト等で手動で画像を結合するとかでしょうか…。)
 |
Re: DXライブラリで描画したマップを画像ファイルに出力したい ( No.6 ) |
- 名前:田中一郎(解決) 日時:2019/11/10 21:45
先ほどお二人の言っている通りにプログラムを改良したら、全体マップを画像ファイルに出力する事ができました。
ただ、指摘があったSetDrawScreen(handle); は前々から記述していたのでそこが原因ではなかったようです。
変更した点はB・Eさんが教えてくれたコードの
SetDrawScreen(DX_SCREEN_BACK); //裏画面を描画先に戻す
DeleteGraph(SaveScreenH); //保存用スクリーンの後始末
を追加した位でしょうか。
もしかしたら何か別のコードを弄っていたのかもしれませんが、多分ここしか触ってないはずです。
でも全体マップを画像ファイルとして見る事が出来るようになったので、(解決)を付けようと思います。
この後もまだ調べてみようと思うので、何か原因が分かったら追記するかもしれません。
B・EさんもTirさんも回答ありがとうございました。
|
Re: DXライブラリで描画したマップを画像ファイルに出力したい ( No.7 ) |
- 名前:田中一郎(解決) 日時:2019/11/11 00:11
やはり質問しておきながらプログラムを載せなかったのは不誠実かと思いここに書いておきます。
実はプログラムを載せなかったのには理由がありまして、ちょっと量が多くて描画の部分だけでも1000行位あるんです。
そしてこのゲームというのも友達と一緒に作っていて、どこかで無料配布しようと計画しているんです。
特に見られても悪い事はないんですが。
固有名詞等が所々書かれてあったり、色々不安があったのでプログラムは記述しませんでした。
でもそれでも的確なアドバイスをしてくださり非常に感謝しています。
ありがとうございました。
|
|