2017/04/09(日) [n年前の日記]
#3 [ruby][dxruby] RGBとHLS(HSL)を変換するRubyスクリプトを書いた
グラデ塗りを試す際に必要になりそうだったので、RGBと
_HLS(HSL)
を変換するRubyスクリプトを書いた。
HLSてのは…。、Hue(色相)、Lightness(輝度)、Saturation(彩度)で色を表す例のヤツ、という説明でいいのだろうか。お絵かきソフトでえてして用意されてたりするアレ。とはちょっと違うか。アレは _HSV か…。
とりあえず、変換処理のソースは以下。
_tinycolorsys.rb
_RGBとHSLの相互変換ツールと変換計算式 - PEKO STEP の解説を参考にして書きました。ありがたや。
使用例。
DXRuby を使って、マウスのx/y座標やカーソルキーの上下でHLSの値を変えて、背景色を変更してる。
require_relative 'tinycolorsys' を呼んで、include TinyColorSys しておくと、hls_to_rgb() と rgb_to_hls() が使えるようになる。
_test_colorsys.rb
HLSてのは…。、Hue(色相)、Lightness(輝度)、Saturation(彩度)で色を表す例のヤツ、という説明でいいのだろうか。お絵かきソフトでえてして用意されてたりするアレ。とはちょっと違うか。アレは _HSV か…。
とりあえず、変換処理のソースは以下。
_tinycolorsys.rb
_RGBとHSLの相互変換ツールと変換計算式 - PEKO STEP の解説を参考にして書きました。ありがたや。
使用例。
DXRuby を使って、マウスのx/y座標やカーソルキーの上下でHLSの値を変えて、背景色を変更してる。
require_relative 'tinycolorsys' を呼んで、include TinyColorSys しておくと、hls_to_rgb() と rgb_to_hls() が使えるようになる。
_test_colorsys.rb
# tinycolorsys.rb の動作テスト
require 'dxruby'
require_relative 'tinycolorsys'
include TinyColorSys
fnt = Font.new(28)
v2 = 0.5
set_hls = true
Window.loop do
break if Input.keyPush?(K_ESCAPE)
set_hls = !set_hls if Input.mousePush?(M_LBUTTON)
v0 = Input.mousePosX.to_f / (Window.width - 1)
v1 = Input.mousePosY.to_f / (Window.height - 1)
v2 += (Input.keyDown?(K_UP))? (1.0 / 255.0) : 0
v2 -= (Input.keyDown?(K_DOWN))? (1.0 / 255.0) : 0
v0 = [[v0, 1.0].min, 0.0].max
v1 = [[v1, 1.0].min, 0.0].max
v2 = [[v2, 1.0].min, 0.0].max
if set_hls
h = v0
l = v1
s = v2
r, g, b = hls_to_rgb(h, l, s)
h = (h * 360).to_i
l = (l * 100).to_i
s = (s * 100).to_i
else
r = (v0 * 255).to_i
g = (v1 * 255).to_i
b = (v2 * 255).to_i
h, l, s = rgb_to_hls(r, g, b)
h = (360 * h).to_i
l = (100 * l).to_i
s = (100 * s).to_i
end
Window.bgcolor = [r, g, b]
col = (l < 50)? C_WHITE : C_BLACK
msg = (set_hls)? "use HLS" : "use RGB"
Window.drawFont(4, 4, msg, fnt, :color => col)
Window.drawFont(4, 40, "RGB=#{r}, #{g}, #{b}", fnt, :color => col)
Window.drawFont(4, 80, "HLS=#{h}, #{l}, #{s}", fnt, :color => col)
Window.drawFont(4, 120, "(mouse x/y , Up/Down key)", fnt, :color => col)
end
◎ 既にgemがあった。 :
上記のスクリプトを書いた後で、ふと気になってググってみたら、既にそういう gem があった…。自分で書く必要は無かった…。
_color | RubyGems.org | your community gem host
_halostatue/color: Color tools for Ruby.
gem install color でインストールできる。
以下は、前述のソレを color を使って書き直した例。
ホント、最初からコレを使えばよかった…。
_color | RubyGems.org | your community gem host
_halostatue/color: Color tools for Ruby.
gem install color でインストールできる。
以下は、前述のソレを color を使って書き直した例。
# gem color の動作テスト
require 'dxruby'
require 'color'
fnt = Font.new(28)
v2 = 0.5
set_hls = true
Window.loop do
break if Input.keyPush?(K_ESCAPE)
set_hls = !set_hls if Input.mousePush?(M_LBUTTON)
v0 = Input.mousePosX.to_f / (Window.width - 1)
v1 = Input.mousePosY.to_f / (Window.height - 1)
v2 += (Input.keyDown?(K_UP))? (1.0 / 255.0) : 0
v2 -= (Input.keyDown?(K_DOWN))? (1.0 / 255.0) : 0
v0 = [[v0, 1.0].min, 0.0].max
v1 = [[v1, 1.0].min, 0.0].max
v2 = [[v2, 1.0].min, 0.0].max
if set_hls
h = v0 * 360.0
l = v1 * 100.0
s = v2 * 100.0
rgb = Color::HSL.new(h, s, l).to_rgb
r = rgb.red
g = rgb.green
b = rgb.blue
else
r = (v0 * 255).to_i
g = (v1 * 255).to_i
b = (v2 * 255).to_i
hsl = Color::RGB.new(r, g, b).to_hsl
h = hsl.hue
l = hsl.luminosity
s = hsl.saturation
end
r = r.to_i
g = g.to_i
b = b.to_i
h = h.to_i
l = l.to_i
s = s.to_i
Window.bgcolor = [r, g, b]
col = (l < 50)? C_WHITE : C_BLACK
msg = (set_hls)? "use HLS" : "use RGB"
Window.drawFont(4, 4, msg, fnt, :color => col)
Window.drawFont(4, 40, "RGB=#{r}, #{g}, #{b}", fnt, :color => col)
Window.drawFont(4, 80, "HLS=#{h}, #{l}, #{s}", fnt, :color => col)
Window.drawFont(4, 120, "(mouse x/y , Up/Down key)", fnt, :color => col)
end
- Color::HSL.new(hue, saturation, luminosity) で渡す値は、hue が 0〜360、saturation と luminosity が 0〜100。
- Color::RGB.new(red, green, blue) で渡す値は、0〜255。
- HSL.to_rgb で RGB になるし、RGB.to_hsl で HSL になる。
- RGB.red、RGB.green、RGB.blue で取り出した値は、0〜255。
- HSL.hue、HSL.luminosity、HSL.saturation で取り出し値は、0〜360、0〜100、0〜100。
- HSL も RGB も、0.0〜1.0を与えて生成するメソッドがあるらしい。hsl = Color:HSL.from_fraction(0.5, 1.0, 0.5) みたいな書き方をすればいいのかな? たぶん。ちと自信無し。
ホント、最初からコレを使えばよかった…。
[ ツッコむ ]
以上です。