PEEKCOLOR

PEEKCOLOR関数は、指定位置の色情報を取得する関数です。戻値はBGRのカラーコードを16進数で表記した6桁です。色成分を分けて取得するには第三引数に取得する色を指定するか、論理積(AND)で成分を分解して取得します。

構文
  1. 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、黄:$00FFFF
RGB値 例) 赤:$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
  1. script.function.PEEKCOLOR(6)
  2. script.function.FUKIDASI(24)
結果

マウス位置の色を取得

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. script.function.SETHOTKEY(2)
  2. script.function.PEEKCOLOR(5)
  3. script.function.FUKIDASI(9)
  4. script.function.SLEEP(10)
解説
  1. 1行目
    SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")
    
    ホットキーを設定する。ESCキーでforceQuit関数を呼び出す。
  2. 3行目
    WHILE TRUE
    
    無限ループ開始。
  3. 4行目
    	DIM c = PEEKCOLOR(G_MOUSE_X, G_MOUSE_Y)
    
    マウス位置のBGR値を取得。例)c = 16513269 = 0xFBF8F5 = 11111011 11111000 11110101b。
    c = 16513269BGR
    16進数FBF8F5
    2進数111110111111100011110101
  4. 5行目
    	DIM r = c AND $FF
    
    BGR値からR成分を取得。F5が返ります。
    BGR
    c111110111111100011110101
    $FF11111111
    c AND $FF11110101
  5. 6行目
    	DIM g = (c AND $FF00) / $100
    
    BGR値からG成分を取得。F8が返ります。
    BGR
    c111110111111100011110101
    $FF001111111100000000
    c AND $FF001111100000000000
  6. 7行目
    	DIM b = (c AND $FF0000) / $10000
    
    BGR値からB成分を取得。FBが返ります。
    BGR
    c111110111111100011110101
    $FF0000111111110000000000000000
    c AND $FF0000111110110000000000000000
  7. 8行目
    	FUKIDASI("赤<#TAB>" + r + "<#CR>緑<#TAB>" + g + "<#CR>青<#TAB>" + b)
    
    各成分を吹き出しに表示。
-PR-