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)

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

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
解説
  1. 2行目
    DIM arr = getBitmap(path)
    
    getBitmap関数で画像「image.bmp」の情報を取得しarr配列に格納。
  2. 3行目
    CHKIMG(path)
    
    「image.bmp」を探して見つかったら座標を取得。
  3. 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を超えるとエラーになります。