HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0111
アキアキノヒロロbmpsave で input 等の内容も 画像保存するには?5解決


アキアキノヒロロ

リンク

2019/1/11(Fri) 08:11:10|NO.86297

パソコン自体で [Alt]+[PrtSc] でスクリーンショットを保存した場合は
オブジェクトもオブジェクト内の内容も画像保存されますが、
bmpsave で画像保存したものには、それらが反映されていません。
アクティブ画面内の全てのイメージを画像保存させる方法を教えて下さい。



この記事に返信する


よっぴー

リンク

2019/1/11(Fri) 09:56:15|NO.86298

デスクトップ全体をキャプチャし、自分のウィンドウだけを切り抜いて表示。
※但し、他のウィンドウと重なっている場合は正常に動きません。
gsel命令などを活用してください。


#uselib "gdi32.dll" #cfunc CreateDC "CreateDCA" sptr,sptr,sptr,int #func DeleteDC "DeleteDC" int #func BitBlt "BitBlt" int,int,int,int,int,int,int,int,int #define NULL 0 #define SRCCOPY 0x00CC0020 #define CAPTUREBLT 0x40000000 ; ウィンドウ非表示 screen 0,640,480 winx=ginfo(12):winy=ginfo(13) wpx=ginfo(4)+3 //なんか誤差あるんで+3 wpy=ginfo(5)+(ginfo(11)-ginfo(13))-2 //デスクトップ全体から見た位置+タイトルバーのYサイズ(誤差で-2) sdim a a="qうぇrちゅいおp@「" font"meiryo",64:objmode 2 input a,320,240,-1 wait 50 ; デスクトップ画面のサイズでバッファ画面を作成 sx = ginfo_dispx : sy = ginfo_dispy buffer 2, sx, sy ; デスクトップ画面のデバイスコンテキスト取得 hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL) ; デスクトップ画面の画像をコピー BitBlt hdc, 0, 0, sx, sy, hdcScreen, 0, 0, SRCCOPY | CAPTUREBLT ; デバイスコンテキスト削除 DeleteDC hdcScreen ; ビットマップファイルとして保存 buffer 3,winx,winy pos 0,0:gcopy 2,wpx,wpy,winx,winy dialog "bmp", 17 if stat { bmpsave refstr } end

参考 : http://chokuto.ifdef.jp/advanced/capturescreen.html



ソラ

リンク

2019/1/11(Fri) 11:08:21|NO.86300

他のウィンドウで隠れてもちゃんとキャプチャーできるやつ。
win7でAero無効か、win7以前だとうまくキャプチャーできないかもしれません。


#uselib "user32.dll" #cfunc GetDC "GetDC" int #uselib "gdi32.dll" #func DeleteDC "DeleteDC" int #func BitBlt "BitBlt" int,int,int,int,int,int,int,int,int #define NULL 0 #define SRCCOPY 0x00CC0020 #define CAPTUREBLT 0x40000000 ; ウィンドウ非表示 screen 0,640,480 boxf sdim a a="qうぇrちゅいおp@「" font"meiryo",64:objmode 2 input a,320,240,-1 wait 50 ; 自ウィンドウのデバイスコンテキストを取得 hdcScreen = GetDC(hwnd) ; 画面のサイズでバッファ画面を作成 buffer 2,ginfo_winx,ginfo_winy ; 画面の画像をコピー。 BitBlt hdc,0,0,ginfo_winx,ginfo_winy, hdcScreen, 0, 0, SRCCOPY | CAPTUREBLT ; デバイスコンテキスト削除 DeleteDC hdcScreen ; ビットマップファイルとして保存 dialog "bmp", 17 if stat { bmpsave getpath(refstr,1)+".bmp";拡張子を消してからつけ直す。 } end



いののて

リンク

2019/1/11(Fri) 17:48:05|NO.86301

PrintWindow を使った方法です。


#uselib "user32.dll" #func PrintWindow "PrintWindow" int,int,int #define PW_CLIENTONLY 0x00000001 screen 0 input a //画面を保存するウィンドウの情報を取得 hnd = hwnd sx = ginfo_sx sy = ginfo_sy buffer 1, sx, sy PrintWindow hnd, hdc, PW_CLIENTONLY //ウィンドウの中身をbufferに描画する dialog "bmp",17 if stat{ s=refstr if getpath(s, 2)=="":s+=".bmp" bmpsave s //保存 }



アキアキノヒロロ

リンク

2019/1/12(Sat) 06:38:31|NO.86306

よっぴーさん、ソラさん、いののてさん
ご返答ありがとうございます。理解が追いつかず、お礼が遅れました。

よっぴーさんのものと格闘していると、ソラさんからも頂き、恐縮しきりでいると、
いののてさんからも別のアプローチで、本当にありがたく思います。
しかしながら、私の力不足で、時間ばかり過ぎてしまいました。
よっぴーさんが参考に上げていらしたサイトの解説を読んでみました。
知識としては、なんとなくそういうものか、といった程度にしか理解が進んでいません。
また、いののてさんの方法に関しては、「PrintWindow」で過去ログ検索してヒットした
f さん、begriffさんのものも参考にし、突き合わせて理解に努めました。
当てずっぽうの一知半解状態ですが、それでも、皆さんの方法、どうにか使えるだけは
使えるように思えてきました。
本来の自分のプログラムは、条件によって大きさを変える「screen」とそれとは別の
「screen」といった、ふたつの「screen」を行き来し、「gosub」で入り組んでいます。
そのため、皆さんの命令を記述する位置によって、なかなか思っている結果を得られません。
試しに作った短かめのものでは、どなたの命令でも成功しているので、引き続き
取り組んでいきます。うまく行き次第、解決といたします。

追伸
NO.86305 の ゆう やん さんも、自分と同じような質問をもっていらっしゃるようです。



アキアキノヒロロ

リンク

2019/1/12(Sat) 10:58:25|NO.86308

御三方のどの方法でも、元の自分のプログラムに組み込んで、
狙い通りの結果を得ましたので、解決といたします。
ありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.