CHKIMG

構文
  1. Boolean = CHKIMG( [画像名, 透過色/色無視, x1, y1, x2, y2, 番号, 色幅] )
引数
画像名
画像ファイル名(BMP形式のみ) (画像名を省略した場合はクリップボードから)
透過色/色無視
0
指定なし(デフォルト)
1,2,3,4
左上,右上,左下,右下.0〜4の1ピクセルの色を透過色として処理
-1
色を無視して形でチェックする
x1, y1, x2, y2
サーチ範囲
番号
複数ある場合に順番を指定 (左上から)
-1
-1が指定された場合はヒットした数を戻値として返し、座標情報は ALL_IMG_X[], ALL_IMG_Y[]に格納
(G_IMG_X、 G_IMG_Yには最後にヒットした位置が入る)
色幅
チェックに色幅を持たせる (色無視指定時もしくは 16bitカラー以下の場合は無効)
IMG_MSK_BGR1
各色(BGR)に対し 2/256の色幅を許す
IMG_MSK_BGR2
各色(BGR)に対し 4/256の色幅を許す
IMG_MSK_BGR3
各色(BGR)に対し 8/256の色幅を許す
IMG_MSK_BGR4
各色(BGR)に対し 16/256の色幅を許す
IMG_MSK_B1, 2, 3, 4
青に対し 2/256, 4/256, 8/256, 16/256の色幅を許す
IMG_MSK_G1, 2, 3, 4
緑に対し 2/256, 4/256, 8/256, 16/256の色幅を許す
IMG_MSK_R1, 2, 3, 4
赤に対し 2/256, 4/256, 8/256, 16/256の色幅を許す
演算可
例:IMG_MSK_B1 or IMG_MSK_R3(青に対し 2/256の色幅を許す + 赤に対し 8/256の色幅を許す)
戻値

有ればTRUE、無ければFALSE

TRUE の場合は見つかった座標を特殊変数G_IMG_X、 G_IMG_Y に格納

番号にて -1指定時はヒットした数を返し、座標情報は配列変数 ALL_IMG_X[], ALL_IMG_Y[] に格納(配列はゼロから)

プログラム実行例

指定した画像が画面上あるかどうか

指定した画像が画面上にあればTrue、なければFalseを返します。

PRINT CHKIMG("image.bmp")

指定画像を色を無視してチェックする

指定した画像が画面上にあればTrue、なければFalseを返します。

PRINT CHKIMG("image.bmp", -1)

指定した範囲に画像があるかチェック

指定画像が左上の範囲にあればTrue、なければFalseを返します。

PRINT CHKIMG("image.bmp", , 0, 0, G_SCREEN_W / 2, G_SCREEN_H / 2)

指定した画像のヒット数を返す

PRINT CHKIMG("image.bmp", , , , , , -1)

指定した画像の中央を左クリック

G_IMG_X・G_IMG_Yはマッチした画像の左上の座標なので、画像の幅・高さの1/2の値を足すことで中央の座標にしています。

DIM path = "image.bmp" DIM arr = getBitmap(path) CHKIMG(path) BTN(LEFT, CLICK, G_IMG_X + arr[1] / 2, G_IMG_Y + arr[2] / 2) ////////////////////////////////////////////////// // 【引数】 // dec : 10進数 // 【戻値】 // 16進数に変換した値 ////////////////////////////////////////////////// FUNCTION decToHex(dec) RESULT = FORMAT(VAL(dec), 0, -1) FEND ////////////////////////////////////////////////// // 【引数】 // str // 【戻値】 // ////////////////////////////////////////////////// FUNCTION Endian(str) DIM len = LENGTH(str) // 偶数でなければ IFB !isEven(len) THEN str = "0" + str len = len + 1 ENDIF DIM res = "" FOR n = 1 TO len STEP 2 res = COPY(str, n, 2) + res NEXT RESULT = res FEND ////////////////////////////////////////////////// // 【引数】 // path : ビットマップ画像のパス // 【戻値】 // 配列。0:サイズ(Byte)、1:幅(px)、2:高さ(px)、3:ビットの深さ(bit) ////////////////////////////////////////////////// FUNCTION getBitmap(path) DIM arr[3] // 戻り値 DIM Stream = CREATEOLEOBJ("ADODB.Stream") Stream.Open() Stream.Type = 1 // adTypeBinary Stream.LoadFromFile(path) DIM tmp = Stream.Read(30) Stream.Close() // BM(0~1) DIM fmt = "" FOR n = 0 TO 1 fmt = fmt + decToHex(tmp[n]) NEXT IFB fmt <> "424D" THEN RESULT = ERR_VALUE EXIT ENDIF // サイズ(2~5) DIM size = "" FOR n = 2 TO 5 size = size + REPLACE(FORMAT(VAL(decToHex(tmp[n])), 2), " ", "0") NEXT arr[0] = hexToDec(Endian(size)) // 幅(18~21) DIM width = "" FOR n = 18 TO 21 width = width + REPLACE(FORMAT(VAL(decToHex(tmp[n])), 2), " ", "0") NEXT arr[1] = hexToDec(Endian(width)) // 高さ(22~25) DIM height = "" FOR n = 22 TO 25 height = height + REPLACE(FORMAT(VAL(decToHex(tmp[n])), 2), " ", "0") NEXT arr[2] = hexToDec(Endian(height)) // ビットの深さ(28~29) DIM bit = "" FOR n = 28 TO 29 bit = bit + REPLACE(FORMAT(VAL(decToHex(tmp[n])), 2), " ", "0") NEXT arr[3] = hexToDec(Endian(bit)) RESULT = SLICE(arr) FEND ////////////////////////////////////////////////// // 【引数】 // hex : 16進数 // 【戻値】 // 10進数に変換した値 ////////////////////////////////////////////////// FUNCTION hexToDec(hex) dec = 0 hex = STRCONV(hex, SC_LOWERCASE) FOR n = 1 TO LENGTH(hex) str = COPY(hex, n, 1) IFB CHKNUM(str) THEN num = str ELSE num = ASC(str) - 87 ENDIF dec = dec + (num * POWER(16, LENGTH(hex) - n)) NEXT RESULT = dec FEND ////////////////////////////////////////////////// // 【引数】 // expr : 評価する式 // truepart : 評価した式がTrueのときに返す値 // falsepart : 評価した式がFalseのときに返す値 // 【戻値】 // truepart : 評価した式がTrueのとき、falsepart : 評価した式がFalseのとき ////////////////////////////////////////////////// FUNCTION IIF(expr, truepart, falsepart) IFB VAL(expr) THEN RESULT = truepart ELSE RESULT = falsepart ENDIF FEND ////////////////////////////////////////////////// // 【引数】 // 数値 : 整数 // 【戻値】 // True : 偶数、False : 奇数 ////////////////////////////////////////////////// FUNCTION isEven(n) IFB n <> VARTYPE(n, VAR_INTEGER) THEN RESULT = ERR_VALUE EXIT ENDIF RESULT = IIF(n MOD 2 = 0, TRUE, FALSE) FEND

サーチ範囲の座標について

左上が基準(x = 0, y = 0)です。x2, y2はx1, y1より大きい値(x1 < x2 かつ y1 < y2が成り立つ範囲)を指定してください。

エラー

CHKIMGでのヒット数が4096を超えるとエラーになります。


この記事は役に立ちましたか?
役に立った 役に立たなかった