Скажем, у меня есть следующая настройка
body {
background: rgba(0,0,0,0.5);
}
#first {
width: 200px;
height: 100px;
background: rgba(255,0,0,0.5);
}
#second {
width: 50px;
height: 50px;
background: rgba(86, 185, 11, .5);
position: absolute;
top: 20px;
left: 20px;
}
Как я могу получить / рассчитать цвет #second
div?
Я сделал снимок экрана с div и проверил их RGB в Photoshop.
Body -> 128,128,128
First red div -> 192,65,65
Second yellowish div -> 140,125,38
Я нашел способ вычислить rgb первого div путем экспериментов. Складываем два значения вместе и затем применяем альфа-канал.
R: (128 + 255) * 0.5 = 191.5
G: (128 + 0) * 0.5 = 64
B: (128 + 0) * 0.5 = 64
Пытался использовать тот же метод для второго div, но теперь все становится сложнее.
R: (((128 + 255) * 0.5) + 86) * 0.5 = 138.5
G: (((128 + 0) * 0.5) + 185) * 0.5 = 124.5
B: (((128 + 0) * 0.5) + 11) * 0.5 = 37.5
Я могу округлить G и B, чтобы получить точный результат, но R отличается на 1,5. И если я увеличу количество цветных слоев, я не знаю, какие результаты я получу.
Есть ли способ лучше его рассчитать?
Обновление: как подсказал Кайидо, я попытался использовать холст. То же самое, используя прямоугольники: Fiddle. Используется
getImageData
для извлечения rgb второго прямоугольника. Возвращенное значение было [122, 105, 6, 223]
. Не используется для использования 8-битных целых чисел в качестве альфа-значения, поэтому [122, 105, 6, 0.8754]
. Несмотря на то, что я извлек некоторое значение rgb, это не сплошной цвет, и это определенно не то, что я измерил в Photoshop, который равен 140,125,38
.
Также, когда я сделал снимок экрана холста и проверил цвет второго прямоугольника, он был 139, 124, 37
, но цвет #second div равен 140,125,38
. Они не совсем то же самое.
В любом случае, я искал способ преобразовать возвращаемое значение из getImageData
, то есть 122, 105, 6, 0.8754
, в 140,125,38
. Я подумал, что если я скомпенсирую недостающую непрозрачность следующим примером, я получу желаемое значение
122 * (255/223) = 139.5 // 140
105 * (255/223) = 120 // 125
6 * (255/223) = 6.86 // 38
что я сделал для R, но тот же метод не работает для G и B. Я пришел к выводу, что холст на самом деле не поможет, если нет способа преобразовать прозрачный цвет в сплошной.
getImageData
. Но вам нужно будет проверить, где перекрываются элементы и т. Д. Возможно, вы также могли бы попробовать html2canvas lib. - person Kaiido   schedule 22.10.2015background-color: white
. Белый прямоугольник сработал. Хотя есть одна маленькая проблема. imageData возвращает[139, 124, 37, 255]
для второго прямоугольника, но последний цвет #second div равен140,125,38
. Вы хоть представляете, почему цвета холста и div не совпадают? - person akinuri   schedule 23.10.2015