Инвертирование переднего цвета (цвет текста) на основе цвета спины в Ruby - PullRequest
0 голосов
/ 24 марта 2019

Я хочу выбрать цвет текста на основе цвета фона hex в Ruby. Например:

Пользователь ввел этот цвет спины:

color1

Тогда ожидается Цвет текста должен быть белым #FFFFFF (белый).

Если пользователь выберет что-то похожее на это:

color2

Тогда Ожидается Цвет текста должен быть #000000 (черный)

Я знаю, что это возможно, и я нашел похожие примеры кода для других языков, таких как JavaScript или c #, но все они основаны на RGB. Я не могу портировать на HEX в ruby.

Ответы [ 2 ]

1 голос
/ 24 марта 2019

Пратха, я выбрал тот же подход, что и ты;Я просто организовал вычисления немного по-другому.

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" 
1 голос
/ 24 марта 2019

Мне удалось сделать один с собой. Пожалуйста, исправьте меня, если это не так или может привести к неожиданным результатам для определенных цветов.

def colorize(hex)
    r = hex[0..1].to_i(16)
    g = hex[2..3].to_i(16)
    b = hex[4..5].to_i(16)
    c = ((r*299)+(g*587)+(b*114))/1000
    (c >= 128) ? :black : :white
end


puts colorize '668899'
# => :white 
puts colorize 'ffefe8'
# => :black
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...