2015-03-17 3 views
4

Все, что я нашел на эту тему, просто преобразует шестнадцатеричный код в rgb, а затем добавляет альфа 1. Я хочу получить нужный альфа от шестнадцатеричных цифр.Преобразование 8-значных шестицветных цветов в цвета rgba?

Цвет, такие как #949494E8 или #DCDCDC8F, очевидно, имеет значение альфа, что это не 0 или 1.

+1

Как вы собираетесь их конвертировать? Рукой? Использование препроцессора? Программно, используя какой язык? – BoltClock

+1

Кроме того, ваш синтаксис кажется неправильным. 8-разрядный шестиугольник обычно следует за форматом AARRGGBB ([ARGB] (http://en.wikipedia.org/wiki/RGBA_color_space#ARGB)), то есть первые две цифры относятся к альфа-каналам. Похоже, вы используете последние две цифры для альфа-канала. – Terry

+0

http://bricss.net/post/12423845540/working-with-8-digit-hex-colors-argb-in-internet –

ответ

14

Я сделал быструю форму JSfiddle, который позволяет для преобразования из 8-значного шестнадцатеричного кода в значения CSS rgba;)

https://jsfiddle.net/teddyrised/g02s07n4/embedded/result/

Основа довольно проста - разделить строку, которую вы предоставили на части из 2-х цифр, и выполнить преобразование в процентное соотношение для альфа-канала и к десятичным знакам для каналов RGB. Разметки выглядит следующим образом:

<form action=""> 
    <select id="format"> 
     <option value="rgba">RGBa: RRGGBBAA</option> 
     <option value="argb">aRGB: AARRGGBB</option> 
    </select> 
    <input type="text" id="hex" value="#949494E8" /> 
    <button>Convert</button> 
</form> 
<p id="rgba"></p> 

логика:

// Remove hash 
var hex = $('#hex').val().slice(1); 

// Split to four channels 
var c = hex.match(/.{1,2}/g); 

// Function: to decimals (for RGB) 
var d = function(v) { 
    return parseInt(v, 16); 
}; 
// Function: to percentage (for alpha), to 3 decimals 
var p = function(v) { 
    return parseFloat(parseInt((parseInt(v, 16)/255)*1000)/1000); 
}; 

// Check format: if it's argb, pop the alpha value from the end and move it to front 
var a, rgb=[]; 
if($('#format').val() == 'argb') { 
    c.unshift(c.pop()); 
} 

// Convert array into rgba values 
a = p(c[3]); 
$.each(c.slice(0,3), function(i,v) { 
    rgb.push(d(v)); 
}); 

Суть преобразования состоит в следующем:

  • Преобразование RGB каналов в шестнадцатеричной системе, в десятичных значений. Это делается с помощью parseInt(hexValue, 16).
  • Преобразование альфа-канала в шестнадцатеричном виде в процентное соотношение. Это делается путем простого преобразования его в десятичные значения (см. Выше) и вычисления его относительного значения до 255.
+0

Хорошая работа Терри! –

+0

спасибо, это очень полезно! – Johannes

3

Вот небольшая подсказка для вас:

В этом случае #DCDCDC8FDC является alpha = 220 ,

Hex в десятичные [DC]:

  1. первое место D = 13 * 16^1 = 208
  2. второе место С = 12 * 16^0 = 12
  3. сумма = 12 + 208 = 220

затем 220/255 = 0,86 непрозрачность.

enter image description here

байты сохраняются в памяти на прямой порядок байтов машины в AABBGGRR порядке

Проверьте это: http://www.statman.info/conversions/hexadecimal.html

+0

Я считаю, что эти цифры (из тем Textmate) являются RRGGBBAA. Если я использую '# F5AA00', который является« цветом выбора », я получаю правильный оранжевый' rgba (245, 170, 0, 1.0) '. Но мне нужна альфа '91', от оригинала' F5AA0091'. – Steve

+0

Какая математика получает значение альфа для 2-символьного гекса? – Steve

+0

Вы хотите, чтобы математическая формула? –