getBitmap

引数に指定したビットマップ画像のサイズ(px)・幅(px)・高さ(px)・ビットの深さ(bpp)を配列で返します。

CHKIMGで見つけた画像の中央をクリックしたいときとかに使えます。

構文
  1. Array = getBitmap( path )
引数
path
ビットマップ画像のパス
戻値
配列。0:サイズ(Byte)、1:幅(px)、2:高さ(px)、3:ビットの深さ(bit)

プログラム

////////////////////////////////////////////////// // 【引数】 // 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 ////////////////////////////////////////////////// // 【引数】 // 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 ////////////////////////////////////////////////// // 【引数】 // 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

プログラム実行例

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

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

ビットマップ画像のサイズを取得

DIM arr = getBitmap("image.bmp") PRINT arr[0] + " Byte" ////////////////////////////////////////////////// // 【引数】 // 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
結果
34922 Byte

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