RGB를 16 진수로, 16 진수를 RGB로


555

RGB 형식의 색상을 16 진수 형식으로 변환하거나 그 반대로 변환하는 방법은 무엇입니까?

예를 들어로 변환 '#0080C0'하십시오 (0, 128, 192).

답변:


1235

참고 : 두 버전 rgbToHex에 대한 정수 값으로 기대할 r, g그리고 b, 당신은 당신이 정수가 아닌 값이있는 경우 자신의 라운딩을 수행해야하므로.

다음은 RGB에서 16 진수로 변환하고 필요한 제로 패딩을 추가합니다.

function componentToHex(c) {
  var hex = c.toString(16);
  return hex.length == 1 ? "0" + hex : hex;
}

function rgbToHex(r, g, b) {
  return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b);
}

alert(rgbToHex(0, 51, 255)); // #0033ff

다른 방법으로 변환 :

function hexToRgb(hex) {
  var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
  return result ? {
    r: parseInt(result[1], 16),
    g: parseInt(result[2], 16),
    b: parseInt(result[3], 16)
  } : null;
}

alert(hexToRgb("#0033ff").g); // "51";

마지막으로 @casablanca 의 답변rgbToHex() 에서 논의 되고 @cwolves의 의견에서 제안 된 대체 버전의 .

function rgbToHex(r, g, b) {
  return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
}

alert(rgbToHex(0, 51, 255)); // #0033ff

2012 년 12 월 3 일 업데이트

다음 hexToRgb()은 "# 03F"와 같은 속기 16 진 삼중 항도 구문 분석 하는 버전입니다 .

function hexToRgb(hex) {
  // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")
  var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
  hex = hex.replace(shorthandRegex, function(m, r, g, b) {
    return r + r + g + g + b + b;
  });

  var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
  return result ? {
    r: parseInt(result[1], 16),
    g: parseInt(result[2], 16),
    b: parseInt(result[3], 16)
  } : null;
}

alert(hexToRgb("#0033ff").g); // "51";
alert(hexToRgb("#03f").g); // "51";


10
@ Vitim.us : <<는 비트 단위 왼쪽 시프트 연산자입니다. g0이 아닌 정수 라고 가정하면 g << 8효과적으로 g256을 곱하여 16 진 표현의 끝에 0을 더합니다. 마찬가지로 r << 164 개의 0을 더합니다. 1 << 24(16 진수로 1000000)를 추가 하면을 1사용하여 행간 을 제거 하면 16 진수 표현이 필요한 0으로 채워집니다 slice(). 예를 들어 rand g가 0이고 b51 인 ((r << 16) + (g << 8) + b).toString(16)경우 문자열 "33"을 반환합니다. 추가 1 << 24하면 "1000033"이 표시됩니다. 그런 다음 스트립 1하고 당신은 거기에 있습니다.
팀 다운

비트 이동 (예 (r << 16):)이 빅 엔디안 컴퓨터와 리틀 엔디안 컴퓨터에서 동일한 결과를 제공합니까? 편집 : 그렇지 않습니다. 이유는 다음과 같습니다. stackoverflow.com/questions/1041554/…
WoodenKitty

@Gothdo : 편집 내용을 롤백하여 죄송하지만 ES6을 사용하는 것은 종종 불가능하거나 실용적이지 않습니다. 이전 버전은 어느 곳에서나 작동합니다.
Tim Down

3
rgbToHex가 작동하지 않습니다. 재미있는 결과를 얻으십시오 : # f55b2f00
TheCrazyProfessor

1
최신 rgbToHex기능에 대해. 전달 된 rgb 값을 정수로 typecast하거나 rgbToHex 함수를 약간 수정하려고합니다. 예 : jsfiddle.net/cydqo6wj 현재 : return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1); 수정 : return "#" + ((1 << 24) + ((+r) << 16) + ((+g) << 8) + (+b)).toString(16).slice(1); 수정 된 버전에서 16/16 진수로 변경하기 전에 rgb 값을 정수로 평가하도록 강제합니다.
user2977468 2016 년

148

hexToRgb의 대체 버전 :

function hexToRgb(hex) {
    var bigint = parseInt(hex, 16);
    var r = (bigint >> 16) & 255;
    var g = (bigint >> 8) & 255;
    var b = bigint & 255;

    return r + "," + g + "," + b;
}

편집 : 3/28/2017 여기에 또 다른 접근법이 있습니다 그것은 더 빠른 것 같습니다

function hexToRgbNew(hex) {
  var arrBuff = new ArrayBuffer(4);
  var vw = new DataView(arrBuff);
  vw.setUint32(0,parseInt(hex, 16),false);
  var arrByte = new Uint8Array(arrBuff);

  return arrByte[1] + "," + arrByte[2] + "," + arrByte[3];
}

편집 : 8/11/2017 더 많은 테스트 후 위의 새로운 접근 방식은 더 빠르지 않습니다.


57
완벽의 라인 : return [r, g, b].join();.
Pavlo

5
또는 완전히 캡슐화 된 단일 라이너 솔루션 :return [(bigint = parseInt(hex, 16)) >> 16 & 255, bigint >> 8 & 255, bigint & 255].join();
Pluto

12
나는 이것을 하나의 조정과 함께 사용하고 있습니다- #전에 16 진수가 아닌 문자를 제거하십시오 ( 앞에서 와 같이 ) parseInt:hex = hex.replace(/[^0-9A-F]/gi, '');
joews

5
속기 버전을 너무 빨리 사용하지 마십시오. JSPerf는이 답변에서 가장 빠르다는 것을 보여줍니다 : jsperf.com/2014-09-16-hex-to-rgb
Olav Kokovkin

1
이것의 출력은 신뢰할 수 없습니다. 검은 색에 가까운 색이 진한 분홍색으로 나타납니다. 최고 답변의 기능을 사용하는 것이 좋습니다.
Maciej Krawczyk

64

Tim Down의 ECMAScript 6 버전 답변

RGB를 16 진수로 변환

const rgbToHex = (r, g, b) => '#' + [r, g, b].map(x => {
  const hex = x.toString(16)
  return hex.length === 1 ? '0' + hex : hex
}).join('')

console.log(rgbToHex(0, 51, 255)); // '#0033ff'

16 진수를 RGB로 변환

배열을 반환합니다 [r, g, b]. 와 같은 속기 16 진 트리플렛과도 작동합니다 "#03F".

const hexToRgb = hex =>
  hex.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i
             ,(m, r, g, b) => '#' + r + r + g + g + b + b)
    .substring(1).match(/.{2}/g)
    .map(x => parseInt(x, 16))

console.log(hexToRgb("#0033ff")) // [0, 51, 255]
console.log(hexToRgb("#03f")) // [0, 51, 255]

보너스 : padStart()방법을 사용하여 RGB를 16 진수로

const rgbToHex = (r, g, b) => '#' + [r, g, b]
  .map(x => x.toString(16).padStart(2, '0')).join('')

console.log(rgbToHex(0, 51, 255)); // '#0033ff'

이 답변은 최신 브라우저에서 지원되지 않는 최신 ECMAScript 기능을 사용합니다. 이 코드가 모든 환경에서 작동하게하려면 Babel 을 사용하여 코드를 컴파일해야합니다.


hexToRgb ()는 쉽게 4, 8 자리 16 RGBA 표기법을 처리하도록되어있다 : .replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i,(m, r, g, b) => '#' + r + r + g + g + b + b)이된다 : .replace(/^#?([a-f\d])([a-f\d])([a-f\d])([a-f\d])$/i,(m, r, g, b, a) => '#' + r + r + g + g + b + b + a + a)그러나 옵션 4 16 진수 값으로 RGBA의와 정규 표현식 작동하게하는 방법은 무엇입니까? 그것은 기능을 절대적으로 완성 시켜서 하나의 정규 표현식을 16 진수 RGB 및 RGBA로 작동시킵니다. 그렇지 않으면 두 개의 정규 표현식, 하나는 3 값, 다른 하나는 4입니다. 4 번째 값을 255로 나누어 rgba ()의 4 번째 인수를 가져와야합니다.
jamess

44

내 버전은 다음과 같습니다.

  function rgb2hex(red, green, blue) {
        var rgb = blue | (green << 8) | (red << 16);
        return '#' + (0x1000000 + rgb).toString(16).slice(1)
  }

  function hex2rgb(hex) {
        // long version
        r = hex.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i);
        if (r) {
                return r.slice(1,4).map(function(x) { return parseInt(x, 16); });
        }
        // short version
        r = hex.match(/^#([0-9a-f])([0-9a-f])([0-9a-f])$/i);
        if (r) {
                return r.slice(1,4).map(function(x) { return 0x11 * parseInt(x, 16); });
        }
        return null;
  }

근사하지만 문제는 hex2rgb였습니다. :)
K. Kilian Lindberg

4
두 가지 방법으로 진행되지는 않지만 어떤 이유로 든이 질문의 다른 RGB 대 16 진수 솔루션이 작동하지 않기 때문에 이것을 찬성해야합니다.
Goose

문제는 rgb2hex에서 처음이었습니다. 어쨌든 나는 자신의 hex2rgb를 추가했습니다.
FelipeC

rgb2hex방법 에 대해 약간 혼란스러워했습니다 . 왜 우리는 추가합니까 0x1000000rgb, 우리는 전화를해야하는 이유 .slice(1)마지막에?
hackjutsu

파란색은 #FF이므로 0x1000000을 추가하므로 # 10000FF이며 첫 번째 "1"을 제거합니다.
FelipeC

26

나는 당신이 HTML 스타일의 16 진수 표기법을 의미한다고 가정합니다 #rrggbb. 주문이 취소 된 것을 제외하고는 코드가 거의 정확합니다. 그것은해야한다:

var decColor = red * 65536 + green * 256 + blue;

또한 비트 시프트를 사용하면 조금 더 쉽게 읽을 수 있습니다.

var decColor = (red << 16) + (green << 8) + blue;

빨간색 인 경우 0 자 패드를 6 자로 남겨 두어야한다는 점을 제외하고는 훌륭합니다.var decColor = (red < 16 ? '0' : '') + (red << 16) + (green << 8) + blue;
Mark Kahn

이것을 제외하고는 작동하는 것 같습니다 : (0,128,192) 아마도 0 때문입니까?
Sindar

@ cwolves : 당신 말이 맞아요. 그러나 정수가 아닌 최종 문자열에 추가해야합니다.
casablanca

@Sindar : 최종 결과 red < 16에 접두사 a 0를 추가 해야하는 경우 @cwolves의 설명을 참조하십시오 .
casablanca

19
좋아, 여기에 :var hexColor = ((1 << 24) + (red << 16) + (green << 8) + blue).toString(16).substr(1);
Mark Kahn

22
function hex2rgb(hex) {
  return ['0x' + hex[1] + hex[2] | 0, '0x' + hex[3] + hex[4] | 0, '0x' + hex[5] + hex[6] | 0];
}

2
나는 간단한 답변을 좋아합니다
Bjorn Behrendt

요술! 이 멋진 원 라이너에 설명을 추가해야합니다.
제임스 해링턴

좋은! 여기에 같은 일이 축소 된와 속성을 가진 객체를 반환 제외하고,의 r, g, b:function hex2rgb(hex){return{r:'0x'+hex[1]+hex[2]|0,g:'0x'+hex[3]+hex[4]|0,b:'0x'+hex[5]+hex[6]|0}}
ashleedawg

21

이 코드는 #fff 및 #ffffff 변형 및 불투명도를 허용합니다.

function hex2rgb(hex, opacity) {
        var h=hex.replace('#', '');
        h =  h.match(new RegExp('(.{'+h.length/3+'})', 'g'));

        for(var i=0; i<h.length; i++)
            h[i] = parseInt(h[i].length==1? h[i]+h[i]:h[i], 16);

        if (typeof opacity != 'undefined')  h.push(opacity);

        return 'rgba('+h.join(',')+')';
}

11

1 행 기능 HEX-RGBA

짧은 형식 #fff과 긴 #ffffff형식을 모두 지원합니다 .
알파 채널 (불투명도)을 지원합니다.
해시를 지정했는지 여부는 상관하지 않으며 두 경우 모두 작동합니다.

function hexToRGBA(hex, opacity) {
    return 'rgba(' + (hex = hex.replace('#', '')).match(new RegExp('(.{' + hex.length/3 + '})', 'g')).map(function(l) { return parseInt(hex.length%2 ? l+l : l, 16) }).concat(opacity||1).join(',') + ')';
}

예 :

hexToRGBA('#fff')        ->  rgba(255,255,255,1)  
hexToRGBA('#ffffff')     ->  rgba(255,255,255,1)  
hexToRGBA('#fff', .2)    ->  rgba(255,255,255,0.2)  
hexToRGBA('#ffffff', .2) ->  rgba(255,255,255,0.2)  
hexToRGBA('fff', .2)     ->  rgba(255,255,255,0.2)  
hexToRGBA('ffffff', .2)  ->  rgba(255,255,255,0.2)  

8
한 줄짜리가 아닌 사람이 읽을 수있는 코드를 작성하십시오. 어쨌든 제작 전에 코드를 축소하면 아무런 이득이 없습니다.
Roko C. Buljan

11

계산 된 스타일 속성에서 색상을 가져 오는 데 사용할 수 있습니다.

function rgbToHex(color) {
    color = ""+ color;
    if (!color || color.indexOf("rgb") < 0) {
        return;
    }

    if (color.charAt(0) == "#") {
        return color;
    }

    var nums = /(.*?)rgb\((\d+),\s*(\d+),\s*(\d+)\)/i.exec(color),
        r = parseInt(nums[2], 10).toString(16),
        g = parseInt(nums[3], 10).toString(16),
        b = parseInt(nums[4], 10).toString(16);

    return "#"+ (
        (r.length == 1 ? "0"+ r : r) +
        (g.length == 1 ? "0"+ g : g) +
        (b.length == 1 ? "0"+ b : b)
    );
}

// not computed 
<div style="color: #4d93bc; border: 1px solid red;">...</div> 
// computed 
<div style="color: rgb(77, 147, 188); border: 1px solid rgb(255, 0, 0);">...</div>

console.log( rgbToHex(color) ) // #4d93bc
console.log( rgbToHex(borderTopColor) ) // #ff0000

참조 : https://github.com/k-gun/so/blob/master/so_util.js


감사합니다. 그러나 작은 오류가 있습니다. (r.length == 1 ? "0" + r : r)녹색과 파란색에 대해 비슷하게 반환해야합니다 .
typhon

7

비트 단위 솔루션은 일반적으로 이상합니다. 그러나이 경우 나는 그것이 더 우아하다고 생각합니다 😄

function hexToRGB(hexColor){
  return {
    red: (hexColor >> 16) & 0xFF,
    green: (hexColor >> 8) & 0xFF,  
    blue: hexColor & 0xFF,
  }
}

용법:

const {red, green, blue } = hexToRGB(0xFF00FF)

console.log(red) // 255
console.log(green) // 0
console.log(blue) // 255

6

// hsl 표기법을 무시하고 색상 값은 일반적으로 이름, rgb, rgba 또는 hex-

// 16 진수는 3 값 또는 6 일 수 있습니다.

// Rgb는 정수 값뿐만 아니라 백분율 일 수 있습니다.

// 최소한 이러한 형식을 모두 고려하는 것이 가장 좋습니다.

String.prototype.padZero= function(len, c){
    var s= this, c= c || "0", len= len || 2;
    while(s.length < len) s= c + s;
    return s;
}
var colors={
    colornames:{
        aqua: '#00ffff', black: '#000000', blue: '#0000ff', fuchsia: '#ff00ff',
        gray: '#808080', green: '#008000', lime: '#00ff00', maroon: '#800000',
        navy: '#000080', olive: '#808000', purple: '#800080', red: '#ff0000',
        silver: '#c0c0c0', teal: '#008080', white: '#ffffff', yellow: '#ffff00'
    },
    toRgb: function(c){
        c= '0x'+colors.toHex(c).substring(1);
        c= [(c>> 16)&255, (c>> 8)&255, c&255];
        return 'rgb('+c.join(',')+')';
    },
    toHex: function(c){
        var tem, i= 0, c= c? c.toString().toLowerCase(): '';
        if(/^#[a-f0-9]{3,6}$/.test(c)){
            if(c.length< 7){
                var A= c.split('');
                c= A[0]+A[1]+A[1]+A[2]+A[2]+A[3]+A[3];
            }
            return c;
        }
        if(/^[a-z]+$/.test(c)){
            return colors.colornames[c] || '';
        }
        c= c.match(/\d+(\.\d+)?%?/g) || [];
        if(c.length<3) return '';
        c= c.slice(0, 3);
        while(i< 3){
            tem= c[i];
            if(tem.indexOf('%')!= -1){
                tem= Math.round(parseFloat(tem)*2.55);
            }
            else tem= parseInt(tem);
            if(tem< 0 || tem> 255) c.length= 0;
            else c[i++]= tem.toString(16).padZero(2);
        }
        if(c.length== 3) return '#'+c.join('').toLowerCase();
        return '';
    }
}
//var c='#dc149c';
//var c='rgb(100%,25%,0)';
//
var c= 'red';
alert(colors.toRgb(c)+'\n'+colors.toHex(c));

내가 본 가장 포괄적 인 버전이라는 의견이있었습니다. rgba에서 색상을 추출 할 수 있다면 좋을 것입니다.
Michael Scheper

6

@ Tim, 답변에 추가하십시오 (댓글에 약간 어색합니다).

작성된 것처럼 rgbToHex 함수는 점 뒤에 요소가 포함 된 문자열을 반환하며 r, g, b 값은 0-255 범위에 있어야합니다.

나는 이것이 가장 분명하게 보일지 확신하지만, 내가 알아내는 데 2 ​​시간이 걸렸고 그때까지 원래의 방법이 7 줄로 올라갔습니다. 내 문제가 다른 곳에 있다는 것을 깨달았습니다. 따라서 다른 사람들의 시간과 번거 로움을 줄이기 위해 전제 조건을 확인하고 불필요한 문자열을 잘라내는 약간 수정 된 코드가 있습니다.

function rgbToHex(r, g, b) {
    if(r < 0 || r > 255) alert("r is out of bounds; "+r);
    if(g < 0 || g > 255) alert("g is out of bounds; "+g);
    if(b < 0 || b > 255) alert("b is out of bounds; "+b);
    return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1,7);
}

5

(2017) SIMPLE ES6 컴포저 블 화살표 기능

ES6을 사용하여 현대적인 기능 / 조성 js를 작성하는 사람들에게는 이것을 공유하는 것을 거부 할 수 없습니다. 다음은 데이터 시각화를 위해 색상 보간을 수행하는 색상 모듈에서 사용중인 매끄러운 단일 라이너입니다.

이것은 알파 채널을 전혀 처리하지 않습니다.

const arrayToRGBString = rgb => `rgb(${rgb.join(',')})`;
const hexToRGBArray = hex => hex.match(/[A-Za-z0-9]{2}/g).map(v => parseInt(v, 16));
const rgbArrayToHex = rgb => `#${rgb.map(v => v.toString(16).padStart(2, '0')).join('')}`;
const rgbStringToArray = rgb => rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/).splice(1, 3)
  .map(v => Number(v));
const rgbStringToHex = rgb => rgbArrayToHex(rgbStringToArray(rgb));

5

시험

let hex2rgb= c=> `rgb(${c.substr(1).match(/../g).map(x=>+`0x${x}`)})`;
let rgb2hex= c=>'#'+c.match(/\d+/g).map(x=>(+x).toString(16).padStart(2,0)).join``


4

두 가지 색상 값 (RGB, 이름 색상 또는 16 진수 값으로 제공됨)을 비교하거나 16 진수로 변환하려면 HTML5 캔버스 객체를 사용하십시오.

var canvas = document.createElement("canvas");
var ctx = this.canvas.getContext('2d');

ctx.fillStyle = "rgb(pass,some,value)";
var temp =  ctx.fillStyle;
ctx.fillStyle = "someColor";

alert(ctx.fillStyle == temp);

3

이런 식으로 갈 수 있습니까?

function RGB2HTML(red, green, blue)
{
    return '#' + red.toString(16) +
           green.toString(16) +
           blue.toString(16);
}

alert(RGB2HTML(150, 135, 200));

표시 # 9687c8


1
> RGB2HTML> 2HTML> TO HTML (ಠ ʖ̯ ಠ) HEX는 HTML과 관련이 없습니다
Даниил Пронин

3

Tim Down의 3 자리 hexToRgb 기능은 다음과 같이 향상 될 수 있습니다.

var hex2Rgb = function(hex){
  var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})|([a-f\d]{1})([a-f\d]{1})([a-f\d]{1})$/i.exec(hex);
  return result ? {        
    r: parseInt(hex.length <= 4 ? result[4]+result[4] : result[1], 16),
    g: parseInt(hex.length <= 4 ? result[5]+result[5] : result[2], 16),
    b: parseInt(hex.length <= 4 ? result[6]+result[6] : result[3], 16),
    toString: function() {
      var arr = [];
      arr.push(this.r);
      arr.push(this.g);
      arr.push(this.b);
      return "rgb(" + arr.join(",") + ")";
    }
  } : null;
};

2

색상 값을 수락하고 불투명도를 추가 할 수 있기 때문에이 문제가 발생했습니다. 그래서 최신 브라우저에서 기본 캔버스를 사용하는이 빠른 jQuery 플러그인을 만들었습니다. 잘 작동하는 것 같습니다.

편집하다

적절한 jQuery 플러그인을 만드는 방법을 알 수 없으므로 일반 함수로 표시합니다.

//accepts any value like '#ffffff', 'rgba(255,255,255,1)', 'hsl(0,100%,100%)', or 'white'
function toRGBA( c ) {
    var
        can  = document.createElement( 'canvas' ),
        ctx  = can.getContext( '2d' );
    can.width = can.height = 1;
    ctx.fillStyle = c;
    console.log( ctx.fillStyle ); //always css 6 digit hex color string, e.g. '#ffffff'
    ctx.fillRect( 0, 0, 1, 1 ); //paint the canvas
    var
        img  = ctx.getImageData( 0, 0, 1, 1 ),
        data = img.data,
        rgba = {
            r: data[ 0 ], //0-255 red
            g: data[ 1 ], //0-255 green
            b: data[ 2 ], //0-255 blue
            a: data[ 3 ]  //0-255 opacity (0 being transparent, 255 being opaque)
        };
    return rgba;
};

2

나는 잘못된 값을 받아들이는 함수가 필요했다.

rgb (-255, 255, 255) rgb (510, 255, 255)

이것은 @cwolves 답변의 분사입니다.

function rgb(r, g, b) {
  this.c = this.c || function (n) {
    return Math.max(Math.min(n, 255), 0)
  };

  return ((1 << 24) + (this.c(r) << 16) + (this.c(g) << 8) + this.c(b)).toString(16).slice(1).toUpperCase();
}

2
R = HexToR("#FFFFFF");
G = HexToG("#FFFFFF");
B = HexToB("#FFFFFF");

function HexToR(h) {return parseInt((cutHex(h)).substring(0,2),16)}
function HexToG(h) {return parseInt((cutHex(h)).substring(2,4),16)}
function HexToB(h) {return parseInt((cutHex(h)).substring(4,6),16)}
function cutHex(h) {return (h.charAt(0)=="#") ? h.substring(1,7):h}

이 기능을 사용하면 문제없이 결과를 얻을 수 있습니다. :)


2

문자열을 허용하는 속기 버전 :

function rgbToHex(a){
  a=a.replace(/[^\d,]/g,"").split(","); 
  return"#"+((1<<24)+(+a[0]<<16)+(+a[1]<<8)+ +a[2]).toString(16).slice(1)
}

document.write(rgbToHex("rgb(255,255,255)"));

아직 16 진수가 아닌지 확인하려면

function rgbToHex(a){
  if(~a.indexOf("#"))return a;
  a=a.replace(/[^\d,]/g,"").split(","); 
  return"#"+((1<<24)+(+a[0]<<16)+(+a[1]<<8)+ +a[2]).toString(16).slice(1)
}

document.write("rgb: "+rgbToHex("rgb(255,255,255)")+ " -- hex: "+rgbToHex("#e2e2e2"));


2

이 답변은 질문에 완벽하게 맞지 않을 수도 있지만 덜 유용 할 수 있습니다.

  1. 임의의 요소 생성

var toRgb = document.createElement('div');

  1. 유효한 스타일을 변환하려는 색상으로 설정하십시오.

toRg.style.color = "hsl(120, 60%, 70%)";

  1. 스타일 속성을 다시 호출

> toRgb.style.color;

< "rgb(133, 225, 133)" 당신의 색깔은 RGB로 변환되었습니다

작품 : Hsl, Hex

작동하지 않음 : 명명 된 색상


이것은 브라우저로 작업 할 때 가장 실용적인 대답 일 수 있습니다. 기존 요소의 색상을 #-표기법으로 표현 된 알려진 색상과 비교하려는 경우가 종종 있습니다.
Panu Logic

2

내 버전의 hex2rbg :

  1. #fff와 같은 짧은 16 진수를 받아들입니다
  2. 알고리즘 호환성은 o (n)이며 정규 표현식을 사용하는 것보다 빠릅니다. 예. String.replace, String.split, String.match
  3. 일정한 공간을 사용하십시오.
  4. rgb 및 rgba를 지원하십시오.

IE8을 사용하는 경우 hex.trim ()을 제거해야 할 수도 있습니다.

예 :

hex2rgb('#fff') //rgb(255,255,255) 
hex2rgb('#fff', 1) //rgba(255,255,255,1) 
hex2rgb('#ffffff') //rgb(255,255,255)  
hex2rgb('#ffffff', 1) //rgba(255,255,255,1)

암호:

function hex2rgb (hex, opacity) {
    hex = hex.trim();
    hex = hex[0] === '#' ? hex.substr(1) : hex;
    var bigint = parseInt(hex, 16), h = [];
    if (hex.length === 3) {
        h.push((bigint >> 4) & 255);
        h.push((bigint >> 2) & 255);
    } else {
        h.push((bigint >> 16) & 255);
        h.push((bigint >> 8) & 255);
    }
    h.push(bigint & 255);
    if (arguments.length === 2) {
        h.push(opacity);
        return 'rgba('+h.join()+')';
    } else {
        return 'rgb('+h.join()+')';
    }
}

참고 h.join(',')로 같은 일이다 h.join().

2

이 스 니펫은 16 진수를 rgb로, rgb를 16 진수로 변환합니다.

데모보기

function hexToRgb(str) { 
    if ( /^#([0-9a-f]{3}|[0-9a-f]{6})$/ig.test(str) ) { 
        var hex = str.substr(1);
        hex = hex.length == 3 ? hex.replace(/(.)/g, '$1$1') : hex;
        var rgb = parseInt(hex, 16);               
        return 'rgb(' + [(rgb >> 16) & 255, (rgb >> 8) & 255, rgb & 255].join(',') + ')';
    } 

    return false; 
}

function rgbToHex(red, green, blue) {
    var out = '#';

    for (var i = 0; i < 3; ++i) {
        var n = typeof arguments[i] == 'number' ? arguments[i] : parseInt(arguments[i]);

        if (isNaN(n) || n < 0 || n > 255) {
            return false;
        }

        out += (n < 16 ? '0' : '') + n.toString(16);
    }
    return out
}

속기는 처리하지만 좋지만 문자열 대신 구조를 반환 할 수 있습니까?
Dunc

1

16 진수 형식이 #AARRGGBB (Alpha, Red, Green, Blue) 인 XAML 데이터로 작업하고 있습니다. 위의 답변을 사용하여 내 해결책은 다음과 같습니다.

function hexToRgba(hex) {
    var bigint, r, g, b, a;
    //Remove # character
    var re = /^#?/;
    var aRgb = hex.replace(re, '');
    bigint = parseInt(aRgb, 16);

    //If in #FFF format
    if (aRgb.length == 3) {
        r = (bigint >> 4) & 255;
        g = (bigint >> 2) & 255;
        b = bigint & 255;
        return "rgba(" + r + "," + g + "," + b + ",1)";
    }

    //If in #RRGGBB format
    if (aRgb.length >= 6) {
        r = (bigint >> 16) & 255;
        g = (bigint >> 8) & 255;
        b = bigint & 255;
        var rgb = r + "," + g + "," + b;

        //If in #AARRBBGG format
        if (aRgb.length == 8) {
            a = ((bigint >> 24) & 255) / 255;
            return "rgba(" + rgb + "," + a.toFixed(1) + ")";
        }
    }
    return "rgba(" + rgb + ",1)";
}

http://jsfiddle.net/kvLyscs3/


1

jQuery에서 직접 변환하려면 다음을 시도하십시오.

  function rgbToHex(color) {
    var bg = color.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
    function hex(x) {
      return ("0" + parseInt(x).toString(16)).slice(-2);
    }
    return     "#" + hex(bg[1]) + hex(bg[2]) + hex(bg[3]);
  }

  rgbToHex($('.col-tab-bar .col-tab span').css('color'))

1
function getRGB(color){
  if(color.length == 7){
    var r = parseInt(color.substr(1,2),16);
    var g = parseInt(color.substr(3,2),16);
    var b = parseInt(color.substr(5,2),16);    
    return 'rgb('+r+','+g+','+b+')' ;
  }    
  else
    console.log('Enter correct value');
}
var a = getRGB('#f0f0f0');
if(!a){
 a = 'Enter correct value'; 
}

a;

1

많은 답변을 고려할 때 (RGB에서 HEX 또는 다른 방법으로) 질문에 부분적으로 만 답변한다는 것을 고려할 때 부분 답변도 게시한다고 생각했습니다.

비슷한 문제가 있었고 유효한 CSS 색상 (HSL (a), RGB (a), HEX 또는 색상 이름)을 입력하고 1. 알파 값을 추가하거나 제거 할 수 있습니다. rgb (a) 객체를 반환합니다. 이 목적을 위해 플러그인을 정확하게 작성했습니다. GitHub 에서 찾을 수 있습니다 (jQuery가 필요하지만 원하는 경우 포크하고 바닐라 버전을 만들 수 있습니다). 여기 데모 페이지가 있습니다. 당신은 자신을 위해 시도 할 수 있습니다 보고 즉시 출력을 볼 .

옵션을 여기에 복사하여 붙여 넣습니다.

RGB 생성기는 하나의 인수 인 색상을 허용하며 asObject, addAlpha 및 removeAlpha의 세 가지 옵션을 제공합니다. 세 가지 옵션을 생략하면 RGB 색상이 문자열로 반환됩니다.

$.rgbGenerator("white")
// Will return rgb(255,255,255)

기본적으로 알파 구성 요소가 포함되어 있습니다. 입력 값에 알파 값이 포함 된 경우 출력은 RGBa 형식입니다.

$.rgbGenerator("hsla(0,100%,50%,0.8)")
// Will return rgba(255,0,0,0.8)

removeAlpha를 true로 설정하여이 동작을 비활성화 할 수 있습니다. 초기 HSLa 또는 RGBa 색상에서 알파 값이 제거됩니다.

$.rgbGenerator("hsla(0,100%,50%,0.8)", {removeAlpha: true})
// Will return rgb(255,0,0)

반면에 알파 채널을 추가하려는 경우 addAlpha를 0과 1 사이의 값으로 설정하면됩니다. 입력이 투명하지 않은 색상이면 알파 값이 추가됩니다. 투명한 값이면 제공된 값이 입력의 알파 구성 요소를 덮어 씁니다.

$.rgbGenerator("hsl(0,100%,50%)", {addAlpha: 0.4})
// Will return rgba(255,0,0,0.4)
$.rgbGenerator("hsla(0,100%,50%,0.8)", {addAlpha: 0.4})
// Will return rgba(255,0,0,0.4)

마지막으로 RGB (a) 색상을 객체로 출력 할 수도 있습니다. r, g, b 및 선택적으로 a로 구성됩니다.

$.rgbGenerator("hsla(0,100%,50%,0.8)", {asObject: true})
/* Will return
{
  "r": 255,
  "g": 0,
  "b": 0,
  "a": 0.8
}
*/
$.rgbGenerator("hsla(0,100%,50%,0.8)", {asObject: true}).r
// Will return 255

1

Tim Down의 최고 평점 답변은 RGB로 변환 할 때 볼 수있는 최상의 솔루션을 제공합니다. 나는 16 진수 변환을 위해 가장 간결한 경계 검사 및 제로 패딩을 제공하기 때문에 16 진수 변환을 위해이 솔루션을 더 좋아합니다.

function RGBtoHex (red, green, blue) {
  red = Math.max(0, Math.min(~~this.red, 255));
  green = Math.max(0, Math.min(~~this.green, 255));
  blue = Math.max(0, Math.min(~~this.blue, 255));

  return '#' + ('00000' + (red << 16 | green << 8 | blue).toString(16)).slice(-6);
};

왼쪽 시프트 '<<'및 '|'사용 운영자는 이것을 재미있는 솔루션으로 만듭니다.


1

나는 이것을 발견했고 그것이 꽤 직설적이며 유효성 검사 테스트를 받았으며 알파 값 (선택 사항)을 지원하기 때문에이 경우에 적합합니다.

당신이하고있는 일을 알고 조금 더 빠르면 정규식 라인을 주석 처리하십시오.

function hexToRGBA(hex, alpha){
    hex = (""+hex).trim().replace(/#/g,""); //trim and remove any leading # if there (supports number values as well)
    if (!/^(?:[0-9a-fA-F]{3}){1,2}$/.test(hex)) throw ("not a valid hex string"); //Regex Validator
    if (hex.length==3){hex=hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2]} //support short form
    var b_int = parseInt(hex, 16);
    return "rgba("+[
        (b_int >> 16) & 255, //R
        (b_int >> 8) & 255, //G
        b_int & 255, //B
        alpha || 1  //add alpha if is set
    ].join(",")+")";
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.