引数に指定したビットマップ画像のサイズ(px)・幅(px)・高さ(px)・ビットの深さ(bpp)を配列で返します。
CHKIMGで見つけた画像の中央をクリックしたいときとかに使えます。
- 構文
- 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 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
プログラム実行例
指定した画像の中央を左クリック
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)
ビットマップ画像のサイズを取得
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 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
- 結果
- 34922 Byte
解説
- 1行目
getBitmap関数で画像「image.bmp」の情報を取得しarr配列に格納。DIM arr = getBitmap("image.bmp")
- 3行目
arr配列0番目にサイズが格納されているので出力。単位はByteなので必要に応じて単位換算。PRINT arr[0] + " Byte"
この記事は役に立ちましたか?