UWSC|高圧縮jpegと劣化なしのbmpを取得する関数|画像検出に必須

ポク太郎です。

高圧縮のJPEG画像と非圧縮のBMP画像を取得する関数を作りました。

前者は主に画像ログ用、後者は画像検出用。

後者はUWSCで画像検索を行う場合には正確な画像データでなければ検出できないので、即座にその画像を取得するための関数です。

スクショから画像保存すると特にマイクソフト製のペイント関連では勝手に加工され認識失敗するので。関数の形式になってますが、画像取得アプリとして独立した実行ファイルにしておくと便利です。


高圧縮のJPEG画像を得る関数getpic(id)関数

画像ログとして残す場合に便利な高圧縮jpegで画像を保存する関数。

指定されたアプリIDのスクショを“pic_000n.jpg”なるファイル名で実行アプリのあるフォルダに保存します。ファイル名作成のためWHILEループを使って番号を調べています。

FUNCTION getpic(id)//id=0:スクリーン全体取得
            n=0
            comp=0
   WHILE (comp=0)
            path=GET_CUR_DIR+"\pic_"+REPLACE(FORMAT(n,4)," ","0")+".jpg"
      IF FOPEN(path,F_EXISTS)
            n=n+1
      ELSE
            SAVEIMG(path,id,,,,,,1)
            disp("画像を取得しました。","gray")
            comp=1
      ENDIF
   WEND
            RESULT=1
FEND
関数プログラム説明(○⇒:成り立つ場合、×⇒:成り立たない場合)
1,15
行目
1
15
FUNCTION getpic(id)//id=0:スクリーン全体取得
FEND
getpic(id)関数宣言:
引数id:アプリケーションID(id=0のとき、スクリーン全体を取得)
2,3
行目
2
3
            n=0
            comp=0
変数初期化
変数n:画像ファイル名として使用するための番号
変数comp:画像ファイルを保存した合図とするフラグ
4,13
行目
4
13
   WHILE (comp=0)
   WEND
変数comp=0の間ずっとループするループ文。
取得した画像ファイルのファイル名は“pic_番号”としますが、重複しないファイル名にするためループして探します。セーブ後に変数comp=1にするとループを抜けます。
5
行目
5             path=GET_CUR_DIR+\pic_+REPLACE(FORMAT(n,4), ,0)+.jpg
変数pathに画像ファイルのパスを代入。
GET_CUR_DIRは実行アプリのあるパス(UWSCの特殊変数)
REPLACE(FORMAT(n,4),” “,”0”)は変数nを4桁の文字列に修正する部分。
例. 4→”0004″
6~12
行目
6
7
8
9
10
11
12
      IF FOPEN(path,F_EXISTS)
            n=n+1
      ELSE
            SAVEIMG(path,id,,,,,,1)
            disp(画像を取得しました。,gray)
            comp=1
      ENDIF
条件分岐:変数pathのファイルが存在するかどうかの判定。

○⇒:変数nに+1する。
×⇒:画像ファイルをセーブし、comp=1に。
UWSC命令SAVEIMG(画像名,[ウィンドウのID,x,y,,高さ,クライアント指定,JPEG指定]) ※JPEG指定:1=高圧縮、100=低圧縮。

disp()関数はこちら(UWSC|情報の吹き出し表示とクリップボードへ転送する関数)で作成したメッセージ表示の自作関数。(表示不要なら10行を削除してもOK。)

14
行目
14             RESULT=1
関数の戻り値として1を返します。

非圧縮のBMP画像を得る関数getpic_dialog()関数

画像認識・画像検索を行う場合、検索対象の画像を取得してプログラムに与えないといけません。それ向けの画像取得関数。

劣化してれば当然認識・検出できませんので非劣化のBMP保存。

スクリーンダンプ(Alt+PrintScreenキー)で取得してWindows標準のPaintで保存すると、(バージョンにより)処理がかけられ元画像と異なるものが保存されてしまいます。これだと認識できないので本関数を使用しUWSC自身で正確なBMP画像を取得します。

仕様は、
●動作(ブラウザ画像取得、5秒後に取得、画面全体取得、5秒後に取得)選択ダイアログを出し、
●指定されたアプリIDのスクリーンショットをファイル名“pic_000x.bmp”で実行アプリのあるフォルダに保存。ファイル名作成のためWHILEループで番号を調べています。

FUNCTION getpic_dialog()
            quit=0
WHILE (0=0)
      SELECT SLCTBOX(slct_btn,0,1,400,"画像を取得します。","取得(ブラウザ画面)","5秒後に取得(ブラウザ画面)","取得(全体)","5秒後に取得(全体)")
      CASE -1
            quit=1
      CASE 1
            mode=1
            wait5s=0
      CASE 2
            mode=1
            wait5s=1
      CASE 4
            mode=0
            wait5s=0
      CASE 8
            mode=0
            wait5s=1
      SELEND
      IF quit=1
            break
      ELSEIF mode=1
            bprep()
            id=bid(brwz)
      ELSE
            id=0
      ENDIF
      IF wait5s=1
         FOR i=5 TO 1 step -1
            disp(i+"秒後に取得します。","gray")
            SLEEP(1)
         NEXT
      ENDIF
            n=0
            comp=0
   WHILE (comp=0)
            path=GET_CUR_DIR+"\pic_"+REPLACE(FORMAT(n,4)," ","0")+".bmp"
      IF FOPEN(path,F_EXISTS)
            n=n+1
      ELSE
            SAVEIMG(path,id,,,,,,,0)
            disp("画像を取得しました。","gray")
            comp=1
      ENDIF
   WEND
SLEEP(0.01)
WEND
            RESULT=1
FEND
関数プログラム説明(○⇒:成り立つ場合、×⇒:成り立たない場合)
1,50
行目
1
50
FUNCTION getpic_dialog()
FEND
getpic_dialog()関数宣言:
ダイアログを表示し、ブラウザ画像、ブラウザ画像(5秒後)、画面全体画像、画面全体画像(5秒後)を選択し、BMP画像を取得する関数。
2
行目
2             quit=0
関数を抜けるフラグ変数quitを初期化。
3,47~48
行目
3
47
48
WHILE (0=0)
SLEEP(0.01)
WEND
無限ループ。
変数quitが1になることで22行目でループから出ます。
4~19
行目
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
      SELECT SLCTBOX(slct_btn,0,1,400,画像を取得します。,取得(ブラウザ画面),5秒後に取得(ブラウザ画面),取得(全体),5秒後に取得(全体))
      CASE 1
            quit=1
      CASE 1
            mode=1
            wait5s=0
      CASE 2
            mode=1
            wait5s=1
      CASE 4
            mode=0
            wait5s=0
      CASE 8
            mode=0
            wait5s=1
      SELEND
選択ダイアログを表示し、ユーザの入力待ち&押されたボタンによる条件分岐。
ユーザの選択は以下のように返されます。
-1:クローズボックスが選択された
 1、2、4、8、16、32、:n番目のボタンが選択された
   (↑case文で指定する数値は2^nで指定するようです。)
UWSC命令select slctbox(slct_btn,0,1,400,選択肢1,選択肢2)…”選択肢1″,”選択肢2″のボタンのあるダイアログを表示します。

設定している変数は、
変数quit :ループを抜けるかどうかのフラグ
変数mode :ブラウザ画面のみか、スクリーン全体を取得するかのフラグ
変数wait5s :5秒間の待ち時間を入れるかどうかのフラグ
押された選択ボタンによりこれらに異なる値を代入しています。

21~28
行目
21
22
23
24
25
26
27
28
      IF quit=1
            break
      ELSEIF mode=1
            bprep()
            id=bid(brwz)
      ELSE
            id=0
      ENDIF
4~19行目で設定された変数による条件分岐。
変数quit=1、つまりクローズボックスが選択されたら⇒関数を抜ける(49行目)
変数mode=1、つまりブラウザ画面のみ取得⇒ブラウザ準備とアプリID取得
それ以外、つまり上記以外⇒スクリーン全体画像を取得するため変数idに0を代入
29~34
行目
29
30
31
32
33
34
      IF wait5s=1
         FOR i=5 TO 1 step 1
            disp(i+秒後に取得します。,gray)
            SLEEP(1)
         NEXT
      ENDIF
変数wait5s=1の場合は、5秒間の待ち時間を入れます。1秒ごとにメッセージを出しながら、待ちます。
UWSC命令SLEEP(秒数)…秒数の間休止します。
35,36
行目
35
36
            n=0
            comp=0
変数初期化
変数n:画像ファイル名として使用するための番号
変数comp:画像ファイルを保存した合図とするフラグ
37,46
行目
37
46
   WHILE (comp=0)
   WEND
変数comp=0の間ずっとループするループ文。
取得した画像ファイルのファイル名を決めるため、重複していないファイル名を探すためにループさせます。セーブ後に変数comp=1にするとループを抜けます。
38
行目
38             path=GET_CUR_DIR+\pic_+REPLACE(FORMAT(n,4), ,0)+.bmp
変数pathに画像ファイルのパスを代入。
GET_CUR_DIRは実行アプリのあるパス(UWSCの特殊変数)
REPLACE(FORMAT(n,4),” “,”0”)は変数nを4桁の文字列に修正する部分。
例. 4→”0004″
39~45
行目
39
40
41
42
43
44
45
      IF FOPEN(path,F_EXISTS)
            n=n+1
      ELSE
            SAVEIMG(path,id,,,,,,,0)
            disp(画像を取得しました。,gray)
            comp=1
      ENDIF
条件分岐:変数pathのファイルが存在するかどうかの判定。

○⇒:変数nに+1する。
×⇒:画像ファイルをセーブし、comp=1に。
UWSC命令SAVEIMG(画像名,[ウィンドウのID,x,y,,高さ,クライアント指定,JPEG指定]) ※こちらはビットマップで保存したいので、JPEG指定の部分を0にします。

disp()関数はこちら(UWSC|情報の吹き出し表示とクリップボードへ転送する関数)で作成したメッセージ表示の自作関数。(表示不要なら43行を削除してもOK。)

49
行目
49             RESULT=1
関数の戻り値として1を返します。



関数の形式になっていますが、2~48行目だけを使用して独立した画像取得用アプリにしておいてもいいかもしれません。

画像検出の話題
BMP画像の幅と高さを得る関数 見つけた指定画像の中心座標を返す関数 高圧縮jpegと劣化なしbmp画像を取得する関数 あいまいな画像認識の前に“できない理由”を調べる
本記事の内容は以下でした。
○画像を得る関数

高圧縮のJPEG画像を得る関数
非圧縮のBMP画像を得る関数

コメント

タイトルとURLをコピーしました