2017年7月16日日曜日

[UWSC]高圧縮jpegと劣化なしのbmp画像を取得する関数

初心者のプログラミング導入のため、UWSCという開発ソフトを使って作り上げる作業を実際にやって見せるカテゴリ。準備した自作関数や使い方、トラブルを記事にしていきます。得るものがあれば幸いです。 
画像ログや画像検索・画像認識のための高圧縮のJPEG画像と非圧縮のBMP画像を得る関数を作りました。

記事の内容

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

ポク太郎です。
高圧縮のJPEG画像と非圧縮のBMP画像を得る関数を作りました。前者は主に画像ログ用、後者は画像検出用です。UWSCでの画像検索を行う場合には正確な画像データでなければ検出できないので、その画像を準備するための関数です。(後者は関数の形式にする必要はなかったのですが。)


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

画像ログとして残す場合に便利な高圧縮jpegで画像を保存する関数です。
仕様は、実行アプリのあるフォルダに指定されたアプリIDのスクリーンショットを“pic_000x.jpg”というファイル名で保存します。ファイル名作成のためWHILEループを使って番号を調べています。
getpic(id)関数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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画像を得る関数

画像認識・画像検索を行う場合は、探す対象の画像を取得してプログラムに与えないといけません。これは、それ向けの画像を取得する関数です。劣化していれば当然検索・認識できませんのでBMP保存。
スクリーンダンプ(Alt+PrintScreenキー)で取得してWindows標準のPaintで保存しようとすると、(バージョンにより)処理がかけられ元画像と異なるものが保存されてしまいます。これだと認識できませんのでこの関数を使用してUWSC自身で正確なBMP画像を取得します。
仕様は、ダイアログを出しユーザに動作(ブラウザ画像取得、5秒後に取得、画面全体画像取得、5秒後に取得)を選択させ、実行アプリのあるフォルダに指定されたアプリIDのスクリーンショットを“pic_000x.bmp”というファイル名で保存します。ファイル名作成のためWHILEループを使って番号を調べています。
getpic_dialog()関数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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行目だけを使用して独立したアプリにしておいてもいいかもしれません。


記事の内容

記事の内容は伝わりましたでしょうか。
○画像を得る関数
高圧縮のJPEG画像を得る関数
非圧縮のBMP画像を得る関数


関数群のダウンロードはこちら
func_poku.uwsのコメント欄に呼び出し方が書いてあります。


【関連記事】[UWSC]配列変数と関数[使い方まとめ]
[UWSC]指定画像が表示された座標を返す関数
[UWSC]BMP画像の幅と高さを得る関数
[UWSC]画像が表示された中心座標を返す関数


スポンサーリンク



ブログ村へ blogramのブログランキング

ポク太郎の「俺の説明聞いてくれ」 コンテンツ
ポク太郎の「俺の説明聞いてくれ」最キラー記事 コンピュータ(ハード/ソフト)
映画・ドラマ・芸能
変人のつぶやきとトラブル
ホームへ戻る


0 件のコメント:

コメントを投稿