Contents
指定画像が画面上にあるかチェックし、あればその情報を返します。
- 構文
- 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[]に格納
- 色幅
- チェックに色幅を持たせる (色無視指定時もしくは 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)
指定した画像の中央を左クリック
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 EVAL(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
解説
- 2行目
getBitmap関数で画像「image.bmp」の情報を取得しarr配列に格納。DIM arr = getBitmap(path)
- 3行目
「image.bmp」を探して見つかったら座標を取得。CHKIMG(path)
- 5行目
画像の中央を左クリック。BTN(LEFT, CLICK, G_IMG_X + arr[1] / 2, G_IMG_Y + arr[2] / 2)
サーチ範囲の座標について
左上が基準(x = 0, y = 0)です。x2, y2はx1, y1より大きい値(x1 < x2 かつ y1 < y2が成り立つ範囲)を指定してください。
エラー
CHKIMGでのヒット数が4096を超えるとエラーになります。
を超えました.png)
この記事は役に立ちましたか?