PEEKCOLOR関数は、指定位置の色情報を取得する関数です。戻値はBGRのカラーコードを16進数で表記した6桁です。色成分を分けて取得するには第三引数に取得する色を指定するか、論理積(AND)で成分を分解して取得します。
- 構文
- Integer = PEEKCOLOR( X, Y, [RGB指定, クリップボード指定] )
- 引数
- X、Y
- 座標 X、Y
- RGB指定
- 0
- BGR値にて返す (デフォルト)
- COL_RGB(3)
- RGB値にて返す
- COL_R(4)
- 赤の成分のみを返す
- COL_G(5)
- 緑の成分のみを返す
- COL_B(6)
- 青の成分のみを返す
- クリップボード指定
- FALSE
- 画面より(デフォルト)
- TRUE
- クリップボードより
- 戻値
- 指定位置の色情報BGR値 例) 青:$FF0000、緑:$00FF00、赤:$0000FF、オレンジ:$0080FF、黄:$00FFFFRGB値 例) 赤:$FF0000、緑:$00FF00、青:$0000FF、オレンジ:$FF8000、黄:$FFFF00
DIM c = PEEKCOLOR(G_MOUSE_X, G_MOUSE_Y)
DIM r = c AND $FF
DIM g = (c AND $FF00) / $100
DIM b = (c AND $FF0000) / $10000
プログラム実行例
カーソル座標と色情報を取得
HASHTBL rgb
WHILE TRUE
DIM x = G_MOUSE_X
DIM y = G_MOUSE_Y
DIM c = PEEKCOLOR(x, y)
rgb["r"] = decToHex(c AND $FF)
rgb["g"] = decToHex((c AND $FF00) / $100)
rgb["b"] = decToHex((c AND $FF0000) / $10000)
IF LENGTH(rgb["r"]) = 1 THEN rgb["r"] = "0" + rgb["r"]
IF LENGTH(rgb["g"]) = 1 THEN rgb["g"] = "0" + rgb["g"]
IF LENGTH(rgb["b"]) = 1 THEN rgb["b"] = "0" + rgb["b"]
c = "" + rgb["b"] + rgb["g"] + rgb["r"]
font = "$" + invertedColor(c)
back = IIF("$" + c = "$000000", "$000001", "$" + c) // $000000は$FFFF00になるので$000001
msg = "(x, y)<#TAB>(" + x + ", " + y + ")<#CR>" + _
"赤<#TAB>" + rgb["r"] + "(" + hexToDec(rgb["r"]) + ")" + "<#CR>" + _
"緑<#TAB>" + rgb["g"] + "(" + hexToDec(rgb["g"]) + ")" + "<#CR>" + _
"青<#TAB>" + rgb["b"] + "(" + hexToDec(rgb["b"]) + ")"
DIM ID = GETID(GET_FUKIDASI_WIN)
DIM ofs = 25
fx = x + IIF(x >= G_SCREEN_W / 2, -1 * (STATUS(ID, ST_WIDTH) + ofs), ofs)
fy = y - STATUS(ID, ST_HEIGHT) * (y / G_SCREEN_H)
FUKIDASI(msg, fx, fy, IIF(x >= G_SCREEN_W / 2, 4, 3), 10, "メイリオ", font, back)
SLEEP(0.001)
WEND
//////////////////////////////////////////////////
// 【引数】
// array : 要素を追加する配列(参照引数)
// str : 追加する要素
// 【戻値】
// 処理後の配列の中の要素の数
//////////////////////////////////////////////////
FUNCTION arrayPush(var arr[], str)
DIM res = RESIZE(arr, UBound(arr) + 1)
arr[res] = str
RESULT = res + 1
FEND
//////////////////////////////////////////////////
// 【引数】
// dec : 10進数
// 【戻値】
// 16進数に変換した値
//////////////////////////////////////////////////
FUNCTION decToHex(dec)
RESULT = FORMAT(VAL(dec), 0, -1)
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
//////////////////////////////////////////////////
// 【引数】
// color
// 【戻値】
//
//////////////////////////////////////////////////
FUNCTION invertedColor(color)
DIM array = strSplit(color, 2)
FOR i = 0 TO UBound(array)
array[i] = decToHex($FF - hexToDec(array[i]))
NEXT
RESULT = JOIN(array, "")
FEND
//////////////////////////////////////////////////
// 【引数】
// string : 分割する文字列
// length : 各要素の最大長
// 【戻値】
//
//////////////////////////////////////////////////
FUNCTION strSplit(string, length = 1)
DIM array[-1]
WHILE LENGTH(string)
arrayPush(array, COPY(string, 1, length))
string = COPY(string, length + 1)
WEND
RESULT = SLICE(array)
FEND
//////////////////////////////////////////////////
// 【引数】
// 配列 : 上限値を求める配列
// 【戻値】
// 配列の上限値
//////////////////////////////////////////////////
FUNCTION UBound(array[])
RESULT = RESIZE(array)
FEND
- 結果
マウス位置の色を取得
SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
WHILE TRUE
DIM c = PEEKCOLOR(G_MOUSE_X, G_MOUSE_Y)
DIM r = c AND $FF
DIM g = (c AND $FF00) / $100
DIM b = (c AND $FF0000) / $10000
FUKIDASI("赤<#TAB>" + r + "<#CR>緑<#TAB>" + g + "<#CR>青<#TAB>" + b)
SLEEP(0.001)
WEND
//////////////////////////////////////////////////
// 【引数】
//
// 【戻値】
//
//////////////////////////////////////////////////
PROCEDURE forceQuit()
EXITEXIT
FEND
解説
- 1行目
ホットキーを設定する。ESCキーでforceQuit関数を呼び出す。SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
- 3行目
無限ループ開始。WHILE TRUE
- 4行目
マウス位置のBGR値を取得。例)c = 16513269 = 0xFBF8F5 = 11111011 11111000 11110101b。DIM c = PEEKCOLOR(G_MOUSE_X, G_MOUSE_Y)
c = 16513269 B G R 16進数 FB F8 F5 2進数 11111011 11111000 11110101
- 5行目
BGR値からR成分を取得。F5が返ります。DIM r = c AND $FF
B G R c 11111011 11111000 11110101 $FF 11111111 c AND $FF 11110101
- 6行目
BGR値からG成分を取得。F8が返ります。DIM g = (c AND $FF00) / $100
B G R c 11111011 11111000 11110101 $FF00 11111111 00000000 c AND $FF00 11111000 00000000
- 7行目
BGR値からB成分を取得。FBが返ります。DIM b = (c AND $FF0000) / $10000
B G R c 11111011 11111000 11110101 $FF0000 11111111 00000000 00000000 c AND $FF0000 11111011 00000000 00000000
- 8行目
各成分を吹き出しに表示。FUKIDASI("赤<#TAB>" + r + "<#CR>緑<#TAB>" + g + "<#CR>青<#TAB>" + b)
この記事は役に立ちましたか?