Пратха, я выбрал тот же подход, что и ты;Я просто организовал вычисления немного по-другому.
W3C разработал меру воспринимаемой яркости любого цвета : (299*r + 114*b + 587*g)/1000
, где r
, b
иg
каждый между 0
и 0xFF
.Максимальное значение равно 255
.
Мы можем определить метод, который выражает яркость цвета в виде доли яркости белого:
WHITE_BRIGHT = 299*0xFF + 114*0xFF + 587*0xFF
#=> 255000
def brightness(rbg)
rb,g = rbg.divmod(0x100)
r,b = rb.divmod(0x100)
(299*r + 114*b + 587*g).fdiv(WHITE_BRIGHT)
end
brightness 0 #=> 0.0
brightness 0xFFFFFF #=> 1.0
brightness 0x668899 #=> 0.5326
brightness 0xFFEFF8 #=> 0.9767...
brightness 0x1F223F #=> 0.1965...
См. Integer # divmod (очень полезный метод) и Integer # fdiv .
Мы просто выбираем цвет фона, чтобы максимизировать разницу между яркостью переднего и заднего плана.Это, очевидно, будет черный или белый, в зависимости от того, больше ли brightness(rgb)
чем 0.5
.
def background(rbg)
brightness(rbg) > 0.5 ? 0 : 0xFFFFFF
end
background(0).to_s(16) #=> "ffffff"
background(0xFFFFFF).to_s(16) #=> "0"
background(0x668899).to_s(16) #=> "0"
background(0xFFEFF8).to_s(16) #=> "0"
background(0x1F223F).to_s(16) #=> "ffffff"