ナビ 制作 公式 ヘルプ


 NADE BBS

 トップ 最新 新規書込 検索

2017-11-20 00:36:11 -月 曜-

340 : Re:Re:範囲を指定してキャプチャ - マミ さん


返信ありがとうございます!
色々試してて遅くなりました…

やっぱり直接範囲指定して切り抜く方法は無さそうですね。
わたしも色々調べてみましたが、一般的な手段で範囲指定して抜くことはでき無そうでした…

クリップボードを極力使いたくない理由は、裏で撮影(連続キャプチャ)が発動したタイミングで
表でPhotoshopなどのレタッチ作業をしているとクリップボードが書き換えられてしまう場合があったからです。

ただ、軽ければ妥協できるとして、”極力”ということだったのですが、頂いたサンプルで試したところ
窓キャプチャとほぼ差がなかった為、今回は見送りさせていただきたいと思います。

こんなアバウトな質問にお答えいただいて、本当にありがとうございました!





残念ながら、なでしこの命令を使って、画面上(起動アプリ上)の任意の場所を
切り取ってくる命令はない様です。

どの部分に時間がかかっているのか不明ですが、なでしこ側のキャプチャ命令が
遅い様でしたら、その部分をWindowsの「ALT + PrintScreen」で置き換えて
クリップボードへのコピーに置き換えてみていはいかがでしょうか?(クリップ
ボードを使う方法になってしまいますが)。以下、サンプルです。

#---ここから---
「calc.exe」を起動
1秒待つ
ハンドル=「電卓」の窓ハンドル検索
ハンドルに『%{PRTSC}』を窓ハンドルキー送信
0.2秒待つ
capとはイメージ
imgとはイメージ
capの画像は『クリップボード』
capの10,10,100,100をimgの0,0へ画像部分コピー
imgを「{デスクトップ}test.bmp」へ画像保存
capを画面クリア
imgを画面クリア
ハンドルに『%{F4}』を窓ハンドルキー送信
#---ここまで---

電卓を起動して窓ハンドルを取得し、それに対して『%{PRTSC}』で
「ALT + PrintScreen」で電卓全体の画像をクリップボードにコピー
してます。それを一旦イメージオブジェクトとしてなでしこ側で
capに読み取り、そのイメージオブジェクトからimgeに部分コピー
する様にしてます。それをファイルに保存しているので、そこは
遅い気がしますが、キャプチャだけならば、Windowsの機能を使って
いる分、なでしこの命令使うよりは高速かと思います。


(編集パスワード送信)

子記事

親記事 (No.335)
返信した記事(元) (No.336)

この内容(No.340)に返信

この内容(No.340)をダウンロード

この内容(No.340)のテキスト表示


2017-11-20 05:48:51 -月 曜-

339 : Re:「デスクトップ」を窓キャプチャからが早いかも - マミ さん


返信ありがとうございます!
色々試してて遅くなりました…

なるほど、デスクトップそのものをダイレクトに撮ったほうが高速なんですね。
ただ、ハンドルキャプチャと違って、手前に窓が無いと正しくキャプチャできないデメリットが…
一部説明を省いてしまいましたが、連続キャプチャしながら特定座標の色差を監視して、条件にハマったRGBを得られたら処理をするという
解りやすく言えば、監視カメラのような処理なんです。

加えて、私のデスクトップサイズが2560*1440で、対象の被撮影窓が1600*900です。
頂いたベンチマークを改編して測定してみたところ
1688ms 窓ハンドルキャプチャ系(撮影元 1600*900→イメージ部品同サイズへ
1679ms デスクトップキャプチャ(Desktop2560*1440→イメージ部品1600*900へ
108ms  ビットブロックAPI   (撮影元 1600*900→フォーム背景同サイズへ
(精度上げるため試行回数 50回)

ということで、他の方に頂いたAPIでやってみようかと思います。
今回作成してるプログラム環境で活用できませんでしたが、かなり興味深い情報を頂けたので
機会がありましたが、デスクトップキャプチャを活用してみたいと思います!

有難う御座いました!





キャプチャ系の命令の時間を計ってみました。

 260ms  ハンドルを指定して「窓ハンドルキャプチャ」する
 260ms  ウィンドウ名を指定して「窓キャプチャ」する
 34ms  画面全体を「窓キャプチャ」して、必要部分を画像コピーする

結果:画面全体をキャプチャして、自力で必要な部分を画像コピーする方法は
   窓ハンドルキャプチャより7倍くらいはやいっぽい
※ 窓キャプチャの引数に「デスクトップ」を指定すると画面全体が撮れます


#---------------ここから 10回やって10で割って1回あたりの時間を測定---------------------
TEMPイメージとはイメージ
その可視はオフ
●窓ハンドルキャプチャB({グループ}objへ,hを)
 hの窓ハンドルサイズ取得
 それを「,」で区切って「x1,y1,x2,y2」へ変数分配
 w=x2-x1
 h=y2-y1
 obj→Wはw
 obj→Hはh
 objを画面クリア
 TEMPイメージへ「デスクトップ」を窓キャプチャ
 TEMPイメージのx1,y1,w,hをobjの0,0へ画像部分コピー

キャプチャ用イメージとはイメージ
その可視はオン

time = システム時間
10回
 //キャプチャ用イメージへ母艦ハンドルを窓ハンドルキャプチャ
 //キャプチャ用イメージへ(母艦のタイトル)を窓キャプチャ
 キャプチャ用イメージへ母艦ハンドルを窓ハンドルキャプチャB
time=(システム時間-time)/10
timeを言う



(編集パスワード送信)

子記事

親記事 (No.335)
返信した記事(元) (No.337)

この内容(No.339)に返信

この内容(No.339)をダウンロード

この内容(No.339)のテキスト表示


2017-11-16 22:10:17 -木 曜-

338 : Re:範囲を指定してキャプチャ - うぇいく さん


APIを使用する感じで試すと以下のような感じでしょうか。
本来、コピー先となる画像の格納先は、コピー元と互換のあるものを
作成すべきところなのですが、イメージ部品に移すために2度目のコピーが
必要になってしまうため、あえて手を抜いています。

---------------
# キャプチャテスト

Aとはイメージ
Aの幅は100
Aの高さは100

対象ウィンドウとは整数
対象ウィンドウ=GetDesktopWindow()

対象ウィンドウの100,100をAへ部分キャプチャ

●部分キャプチャ(HWNDのX,Yを{グループ}IMGへ)
 hdcとは整数
 rtnとは整数
 hdc=GetDC(HWND)
 # SRCCOPY=$00CC0020
 rtn=BitBlt(IMG→ハンドル,0,0,IMG→幅,IMG→高さ,hdc,X,Y,$00CC0020)
 rtn=ReleaseDC(HWND,hdc)

●GetDC(hWnd)=DLL("user32.dll",
"HDC GetDC(
  HWND hWnd   // ウィンドウのハンドル
)")
●BitBlt(hdcDest,nXDest,nYDest,nWidth,nHeight,hdcSrc,nXSrc,nYSrc,dwRop)=DLL("gdi32.dll",
"BOOL BitBlt(
  HDC hdcDest, // コピー先デバイスコンテキストのハンドル
  int nXDest,  // コピー先長方形の左上隅の x 座標
  int nYDest,  // コピー先長方形の左上隅の y 座標
  int nWidth,  // コピー先長方形の幅
  int nHeight, // コピー先長方形の高さ
  HDC hdcSrc,  // コピー元デバイスコンテキストのハンドル
  int nXSrc,   // コピー元長方形の左上隅の x 座標
  int nYSrc,   // コピー元長方形の左上隅の y 座標
  DWORD dwRop  // ラスタオペレーションコード
)")
●ReleaseDC(hWnd,hDC)=DLL("user32.dll",
"int ReleaseDC(
  HWND hWnd,  // ウィンドウのハンドル
  HDC hDC     // デバイスコンテキストのハンドル
)")
●GetDesktopWindow()=DLL("user32.dll",
"HWND GetDesktopWindow(
)")
---------------


(編集パスワード送信)

子記事

親記事 (No.335)
返信した記事(元) (No.335)

この内容(No.338)に返信

この内容(No.338)をダウンロード

この内容(No.338)のテキスト表示


2017-11-16 22:01:10 -木 曜-

337 : 「デスクトップ」を窓キャプチャからが早いかも - とけい さん


キャプチャ系の命令の時間を計ってみました。

 260ms  ハンドルを指定して「窓ハンドルキャプチャ」する
 260ms  ウィンドウ名を指定して「窓キャプチャ」する
 34ms  画面全体を「窓キャプチャ」して、必要部分を画像コピーする

結果:画面全体をキャプチャして、自力で必要な部分を画像コピーする方法は
   窓ハンドルキャプチャより7倍くらいはやいっぽい
※ 窓キャプチャの引数に「デスクトップ」を指定すると画面全体が撮れます


#---------------ここから 10回やって10で割って1回あたりの時間を測定---------------------
TEMPイメージとはイメージ
その可視はオフ
●窓ハンドルキャプチャB({グループ}objへ,hを)
 hの窓ハンドルサイズ取得
 それを「,」で区切って「x1,y1,x2,y2」へ変数分配
 w=x2-x1
 h=y2-y1
 obj→Wはw
 obj→Hはh
 objを画面クリア
 TEMPイメージへ「デスクトップ」を窓キャプチャ
 TEMPイメージのx1,y1,w,hをobjの0,0へ画像部分コピー

キャプチャ用イメージとはイメージ
その可視はオン

time = システム時間
10回
 //キャプチャ用イメージへ母艦ハンドルを窓ハンドルキャプチャ
 //キャプチャ用イメージへ(母艦のタイトル)を窓キャプチャ
 キャプチャ用イメージへ母艦ハンドルを窓ハンドルキャプチャB
time=(システム時間-time)/10
timeを言う


(編集パスワード送信)

子記事

親記事 (No.335)
返信した記事(元) (No.335)

この内容(No.337)に返信

この内容(No.337)をダウンロード

この内容(No.337)のテキスト表示


2017-11-16 16:52:25 -木 曜-

336 : Re:範囲を指定してキャプチャ - UNOパパ さん


残念ながら、なでしこの命令を使って、画面上(起動アプリ上)の任意の場所を
切り取ってくる命令はない様です。

どの部分に時間がかかっているのか不明ですが、なでしこ側のキャプチャ命令が
遅い様でしたら、その部分をWindowsの「ALT + PrintScreen」で置き換えて
クリップボードへのコピーに置き換えてみていはいかがでしょうか?(クリップ
ボードを使う方法になってしまいますが)。以下、サンプルです。

#---ここから---
「calc.exe」を起動
1秒待つ
ハンドル=「電卓」の窓ハンドル検索
ハンドルに『%{PRTSC}』を窓ハンドルキー送信
0.2秒待つ
capとはイメージ
imgとはイメージ
capの画像は『クリップボード』
capの10,10,100,100をimgの0,0へ画像部分コピー
imgを「{デスクトップ}test.bmp」へ画像保存
capを画面クリア
imgを画面クリア
ハンドルに『%{F4}』を窓ハンドルキー送信
#---ここまで---

電卓を起動して窓ハンドルを取得し、それに対して『%{PRTSC}』で
「ALT + PrintScreen」で電卓全体の画像をクリップボードにコピー
してます。それを一旦イメージオブジェクトとしてなでしこ側で
capに読み取り、そのイメージオブジェクトからimgeに部分コピー
する様にしてます。それをファイルに保存しているので、そこは
遅い気がしますが、キャプチャだけならば、Windowsの機能を使って
いる分、なでしこの命令使うよりは高速かと思います。

(編集パスワード送信)

子記事

親記事 (No.335)
返信した記事(元) (No.335)

この内容(No.336)に返信

この内容(No.336)をダウンロード

この内容(No.336)のテキスト表示


戻る < < < > > > 次へ



RSS


www.eznavi.net