AutoHotkeyでカーソル位置のカラーコードを取得できると知り、なんて便利なのかと感動しました。これまでChrome拡張や画像編集ソフトの機能で取得していましたが、アプリケーションに依らないホットキーでできてしまうなら作業がずっと楽になります。
色情報の取得に使うのはPixelGetColorコマンドとMouseGetPosコマンドです。
MouseGetPos, MouseX, MouseY ;マウスカーソルの位置情報を取得して変数MouseX,MouseYに入れる
PixelGetColor, color, %MouseX%, %MouseY%, RGB ;指定した位置の色情報を変数colorに入れる
;例えばnoteのロゴの緑を取得してみると変数colorには「0x41C9B4」が入ります
取得した情報をクリップボードに入れれば良いのですが、このままの形だとちょっと使いにくく感じます。なので文字列操作のコマンドをいくつか使って形を変えたいと思います。
まず16進数のカラーコード6桁にしてみます。16進数であることを示している「0x」を取り除くだけなので、これはとても簡単です。
;先頭に#をつけない時
string := SubStr(color,3)
;先頭に#をつける時
string := "#" . SubStr(color,3)
SubStr()メソッドは、SubStr(変数,開始位置,文字数)で、指定した変数の指定した位置から指定したサイズの文字列を取り出します。文字数指定を省略すると、開始位置以降全部を取得します。
今度はRGB値に変換してみます。R値、G値、B値それぞれを取り出してSetFormatコマンドで10進数に変換し、「rgb(r,g,b)」の形の文字列を作ります。
r := "0x" . SubStr(color,3,2) ;R部分の2桁を取り出し、16進数の数値であることを示す「0x」を頭につける
r += 0 ;SetFormatを発動させるために、値の変わらない数値演算をする
SetFormat, integer, d ;変数rの中身を10進数に変換する
g := "0x" . SubStr(color,5,2)
g += 0
SetFormat, integer, d
b := "0x" . SubStr(color,7,2)
b += 0
SetFormat, integer, d
string := "rgb(" . r . "," . g . "," . b . ")" ;変数stringに文字列を作って入れる
SetFormatコマンドは直前の数値演算結果のフォーマットを変更してくれるものですが、「数値演算」が行われていないといけないので、0を足すという特に意味のない計算をしています。
なお「integer」は「整数値」、「d」は「10進数」を意味しています。10進数を16進数にすることもできますし、小数値のフォーマットもできます。
さてカラーコードとRGB形式の両方を取得できるようになったところで、関数にまとめたいと思います。
PickColor(){
MouseGetPos, MouseX, MouseY
PixelGetColor, color, %MouseX%, %MouseY%, RGB
MsgBox, 4, , RGB形式(10進数)にしますか?
IfMsgBox, Yes
RGB := true
Else IfMsgBox, No
RGB := false
If(RGB){
r := "0x" . SubStr(color,3,2)
r += 0
SetFormat, integer, d
g := "0x" . SubStr(color,5,2)
g += 0
SetFormat, integer, d
b := "0x" . SubStr(color,7,2)
b += 0
SetFormat, integer, d
string := "rgb(" . r . "," . g . "," . b . ")"
}Else{
string := "#" . SubStr(color,3) ;「#」をつける時はこっち
;string := SubStr(color,3) ;「#」が要らない時はこちらに変更
}
Clipboard = %string%
MsgBox, %string% を取得しました。
Return
}
vk1D & C::PickColor() ;無変換キー+Cで発動(その時点のカーソル位置の色を取得)
私の場合はカラーコード6桁とRGB形式とどちらが欲しいかがその時によって違うので、その都度ダイアログでどちらで取得するのか選択できるようにしましたが、必要な形式が決まっているならそうする必要はないですね。引数で分岐してもいいですし、そもそも両方作る必要がない人もいるでしょう。
どのタイミングでどう指定して分岐させるのかということは数本前の記事でちょっと書きました。コーディングが不慣れな人は良かったらこちらをどうぞ。