[javascript] 16 진수를 RGBA로 변환

내 바이올린-http: //jsbin.com/pitu/1/edit

나는 쉬운 hex to rgba 변환을 시도하고 싶었습니다. 내가 사용한 적이있는 브라우저는 rgb를 기본값으로 사용하여 색상을 렌더링하므로 극단적 인 색상 선택기를 사용할 때 16 진수 값이 생성하는 배경 색상을 잡아서 16 진수 값을 rgb로 변환합니다 (기본적으로 rgb = 단순 변환)

)기호를으로 바꾸려고했지만 , 1)작동하지 않았으므로 rgb를 rgba로 변환하는 방법을 확인 하려고했는데 여전히 문제가 있습니다.

jquery

$('.torgb').val($('#color').css('background-color'));
$('.torgba').val().replace(/rgb/g,"rgba");

목표
여기에 이미지 설명 입력

수정 :

TinyColor 는 내가 여기에서 원하는 모든 것을 수행하는 훌륭한 색상 조작 js 라이브러리입니다. 나는 너희들이 그것을 시도하고 싶을 것이라고 생각한다! -https : //github.com/bgrins/TinyColor



답변

//If you write your own code, remember hex color shortcuts (eg., #fff, #000)

function hexToRgbA(hex){
    var c;
    if(/^#([A-Fa-f0-9]{3}){1,2}$/.test(hex)){
        c= hex.substring(1).split('');
        if(c.length== 3){
            c= [c[0], c[0], c[1], c[1], c[2], c[2]];
        }
        c= '0x'+c.join('');
        return 'rgba('+[(c>>16)&255, (c>>8)&255, c&255].join(',')+',1)';
    }
    throw new Error('Bad Hex');
}

hexToRgbA('#fbafff')

/*  returned value: (String)
rgba(251,175,255,1)
*/


답변

@ ElDoRado1239는 올바른 아이디어를 가지고 있지만 더 깨끗한 방법도 있습니다.

function hexToRGB(hex, alpha) {
    var r = parseInt(hex.slice(1, 3), 16),
        g = parseInt(hex.slice(3, 5), 16),
        b = parseInt(hex.slice(5, 7), 16);

    if (alpha) {
        return "rgba(" + r + ", " + g + ", " + b + ", " + alpha + ")";
    } else {
        return "rgb(" + r + ", " + g + ", " + b + ")";
    }
}

hexToRGB('#FF0000', 0.5);


답변

‘#’이 있거나없는 6 자 16 진수 만 처리하는 ES6 함수 :

const hex2rgba = (hex, alpha = 1) => {
  const [r, g, b] = hex.match(/\w\w/g).map(x => parseInt(x, 16));
  return `rgba(${r},${g},${b},${alpha})`;
};

용법:

hex2rgba('#af087b', .5)   // returns: rgba(175,8,123,0.5)
hex2rgba('af087b', .5)    // returns: rgba(175,8,123,0.5)
hex2rgba('af087b')        // returns: rgba(175,8,123,1)


답변

TypeScript 버전 정리 :

hexToRGB(hex: string, alpha: string) {

  const r = parseInt(hex.slice(1, 3), 16);
  const g = parseInt(hex.slice(3, 5), 16);
  const b = parseInt(hex.slice(5, 7), 16);

  if (alpha) {
    return `rgba(${r}, ${g}, ${b}, ${alpha})`;
  } else {
    return `rgb(${r}, ${g}, ${b})`;
  }
}

@AJFarkas의 답변을 기반으로합니다.


답변

모든 16 진 형태 모듈 방식

주요 과제는 2018 년 현재 몇 가지 형태의 HEX가 있다는 것입니다. 6 자 전통 형식, 3 자 단축 형식, 알파를 포함하는 새로운 4 자 및 8 자 형식. 다음 함수는 모든 HEX 형식을 처리 할 수 ​​있습니다.

const isValidHex = (hex) => /^#([A-Fa-f0-9]{3,4}){1,2}$/.test(hex)

const getChunksFromString = (st, chunkSize) => st.match(new RegExp(`.{${chunkSize}}`, "g"))

const convertHexUnitTo256 = (hexStr) => parseInt(hexStr.repeat(2 / hexStr.length), 16)

const getAlphafloat = (a, alpha) => {
    if (typeof a !== "undefined") {return a / 255}
    if ((typeof alpha != "number") || alpha <0 || alpha >1){
      return 1
    }
    return alpha
}

export const hexToRGBA = (hex, alpha) => {
    if (!isValidHex(hex)) {throw new Error("Invalid HEX")}
    const chunkSize = Math.floor((hex.length - 1) / 3)
    const hexArr = getChunksFromString(hex.slice(1), chunkSize)
    const [r, g, b, a] = hexArr.map(convertHexUnitTo256)
    return `rgba(${r}, ${g}, ${b}, ${getAlphafloat(a, alpha)})`
}

Alpha는 다음과 같은 방법으로 함수에 제공 될 수 있습니다.

  1. 4 또는 8 양식의 일부로 HEX.
  2. 0-1 사이의 두 번째 매개 변수로

산출

    const c1 = "#f80"
    const c2 = "#f808"
    const c3 = "#0088ff"
    const c4 = "#0088ff88"
    const c5 = "#98736"

    console.log(hexToRGBA(c1))   //  rgba(255, 136, 0, 1)
    console.log(hexToRGBA(c2))   //  rgba(255, 136, 0, 0.53125)
    console.log(hexToRGBA(c3))   //  rgba(0, 136, 255, 1)
    console.log(hexToRGBA(c4))   //  rgba(0, 136, 255, 0.53125)
    console.log(hexToRGBA(c5))   //  Uncaught Error: Invalid HEX

    console.log(hexToRGBA(c1, 0.5))   //  rgba(255, 136, 0, 0.5)
    console.log(hexToRGBA(c3, 0.5))   //  rgba(0, 136, 255, 0.5)


답변

다음은 알파를 제공하면 rgb 또는 rgba를 반환하는 함수입니다. 이 함수는 또한 짧은 16 진수 색상 코드도 변환합니다.

함수:

function hexToRgb(hex, alpha) {
   hex   = hex.replace('#', '');
   var r = parseInt(hex.length == 3 ? hex.slice(0, 1).repeat(2) : hex.slice(0, 2), 16);
   var g = parseInt(hex.length == 3 ? hex.slice(1, 2).repeat(2) : hex.slice(2, 4), 16);
   var b = parseInt(hex.length == 3 ? hex.slice(2, 3).repeat(2) : hex.slice(4, 6), 16);
   if ( alpha ) {
      return 'rgba(' + r + ', ' + g + ', ' + b + ', ' + alpha + ')';
   }
   else {
      return 'rgb(' + r + ', ' + g + ', ' + b + ')';
   }
}

예 :

hexToRgb('FF0000');// rgb(255, 0, 0)
hexToRgb('#FF0000');// rgb(255, 0, 0)
hexToRgb('#FF0000', 1);// rgba(255, 0, 0, 1)
hexToRgb('F00');// rgb(255, 0, 0)
hexToRgb('#F00');// rgb(255, 0, 0)
hexToRgb('#F00', 1);// rgba(255, 0, 0, 1)


답변

ES6 최신, RegEx 무료, 오류 검사 및 상수 화살표 기능이있는 솔루션으로 오류에 대해 null을 반환합니다. alpha가 제공되지 않으면 기본값 1이 사용됩니다.

const hexToRGB = (hex, alpha = 1) => {
    let parseString = hex;
    if (hex.startsWith('#')) {parseString = hex.slice(1, 7);}
    if (parseString.length !== 6) {return null;}
    const r = parseInt(parseString.slice(0, 2), 16);
    const g = parseInt(parseString.slice(2, 4), 16);
    const b = parseInt(parseString.slice(4, 6), 16);
    if (isNaN(r) || isNaN(g) || isNaN(b)) {return null;}
    return `rgba(${r}, ${g}, ${b}, ${alpha})`;
};

참고 : null오류에 대해 반환 됩니다. {return null;}throw 문 :으로 대체 할 수 {throw "Not a valid hex color!";}있지만 다음에서 호출해야합니다
try-catch.

hexToRGB("#3454r5") => null
hexToRGB("#345465") => rgba(52, 84, 101, 1)
hexToRGB("#345465", 0.5) => rgba(52, 84, 101, 0.5)