RGB 값 대신 16 진수 색상 값을 얻는 방법은 무엇입니까?


171

다음 jQuery를 사용하면 요소 배경색의 RGB 값을 얻을 수 있습니다.

$('#selector').css('backgroundColor');

RGB 대신 16 진수 값을 얻는 방법이 있습니까?


2
관련 주제에, 진수와 RGB 색상 사이의 변환에 더 (그리고 틀림없이 더 나은) 방법으로 현재 위치 : stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb 이 휠은 충분한 시간을 재창조되었습니다 로드 트레인을 만들 수 있습니다. 덜 인기있는 JS 라이브러리 중 하나가 유틸리티 기능을 갖기를 바랍니다.
Michael Scheper

일부 브라우저는 검은 색이 아닌 투명한 rgba (0,0,0,0)와 같은 rgba (#, #, #, #)를 반환합니다. 네 번째 값은 불투명도이며 1.0은 풀 컬러 100 %, 0.5는 50 %입니다.
Twelve24 2016 년

답변:


141
var hexDigits = new Array
        ("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"); 

//Function to convert rgb color to hex format
function rgb2hex(rgb) {
 rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
 return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
}

function hex(x) {
  return isNaN(x) ? "00" : hexDigits[(x - x % 16) / 16] + hexDigits[x % 16];
 }

( 소스 )


7
+1, Number.toString (16)을 사용할 수 있습니다-최소한 각 16 진수 숫자 (또는 16 미만인 경우 0으로
채워짐

19
-1. orip에서 언급했듯이 toString (16)을 사용할 수 있습니다. 다른 비 효율성으로 인해 하향 조정되었습니다. 모든 함수 호출에서 hexDigits를 선언하려면 적어도 rgb2hex의 함수 본문 (16 진수 본문이 아님)에서 수행하십시오. 따라서 rgb2hex에 대한 1 호출 당 3 번 배열이 재정의되지 않습니다. 또한 'var'을 사용하는 방법을 배우므로 전역 범위를 오염시키지 않습니다.
Matt

3
이 방법은 다른 공백 또는 대문자 사용에 대해 매우 관대 해 보이지 않습니다. jsfiddle.net/Xotic750/pSQ7d
Xotic750

1
실제로 pedantic이되고 싶다면 정규식을보다 관용적으로 만들 수 있습니다. rgb.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i)그러나 주어진 정규식은 jQuery를 사용할 때 브라우저가 제공하는 형식에 대처하도록 설계되었으며 이는 공백 또는 캡틸 레이션 의존성이 다릅니다. 당신은 이야기하고 있습니다. 동일한 정규 표현식을 사용하고 모든 공백을 제거하고 rgb에서 일치시키기 전에 소문자로 변환 할 수도 있습니다. 추신 : 당신의 바이올린 예제 : 'rgb (10, 128,)'나는 그것이 테스트하기에 합리적이지 않다고 생각합니다.
binderbound

그리고 나를 위해 jquery css background-colors의 반환은 rgba 형식으로 제공되므로 작동하지 않습니다.
Miguel

159

@Matt 제안을 기반으로 작성한 클리너 솔루션은 다음과 같습니다.

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

일부 브라우저는 이미 Internet Explorer 8 이하에서 16 진수로 색상을 반환합니다. 이러한 경우를 처리 해야하는 경우 @gfrobenius가 제안한 것처럼 함수 내부에 조건을 추가하십시오.

function rgb2hex(rgb) {
    if (/^#[0-9A-F]{6}$/i.test(rgb)) return rgb;

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

jQuery를 사용하고 더 완벽한 접근 방식을 원한다면 이 질문에 대답했을 때 보여준 jQuery 1.4.3부터 사용 가능한 CSS 후크를 사용할 수 있습니다. jQuery.css ( "backgroundColor")를 16 진수 형식으로 반환 할 수 있습니까?


2
나는 모든 사람들에게 제안한다 : jQuery CSS Hooks를 사용하여 개선 된 버전을 보려면 여기 에서 내 응답을 살펴보십시오 .
Erick Petrucelli

1
@Ghigo, 죄송하지만 잘못되었습니다. IE8은 현재 스타일을 가져올 때 이미 다음과 같은 색상을 16 진수로 반환합니다 document.getElementById("your_id").currentStyle["backgroundColor"]. 기능 rgb2hex()이 필요하지 않습니다. : 여기에 이미 다른 브라우저에서 색상을 복구 할 수있는 모든 검증 않는, 위의 제안한다는 CSS 후크를 사용하여 플러그인 jQuery를의 stackoverflow.com/questions/6177454/...
에릭 Petrucelli

2
@Ghigo, 나는 당신이 오해한다고 생각합니다 : 당신은 16 진수로 돌아가는 브라우저에 있다면이 기능을 사용하지 않아야합니다. 이 함수는 RGB를 HEX로 변환합니다. RGB가 아닌 경우에는 사용하지 마십시오. 더 완벽한 솔루션이 필요하다는 사실 (@ Jim-F에서 만든 값이 이미 RGB인지 감지)은이 솔루션이 OP에서 요청한 것을 정확하게 제공한다는 사실을 변경하지 않습니다. 당신의 downvote는 말이되지 않습니다. 죄송합니다.
Erick Petrucelli

4
죄송하지만 동의하지 않습니다. 크로스 브라우저 기능은 항상 브라우저 감지를 기반으로 실행해야하는 것보다 낫습니다. Op $('#selector').css('backgroundColor')는 rgb 값이 아닌 16 진수 로 변환 하도록 요청했습니다 . 그리고 IE8에서는 $('#selector').css('backgroundColor')이미 16 진수이므로 처리해야합니다. 그게 다야. 나에게 화 내지 마라 :)
Ghigo

1
rgb2hex()@ErickPetru 덕분에 함수에 추가 한 간단한 라이너 인이 사람을하십시오 ! 나는 그것을 믿거 나 말거나 IE7로 다시 코딩해야합니다. 함께 .css('backgroundColor')네이티브 obj.style.backgroundColor나는의 첫 번째 줄이 추가 그래서 IE7 & 8, 진수가 아닌 RGB를 반환합니다 rgb2hex(): 제공된 대답 기능은 모든 IE7로가는 길에 다시 작동하므로 /* IE7&8 will return hex, so no need to run this function if it is already hex. */ if (/^#[0-9A-F]{6}$/i.test(rgb)) return rgb.substring(1, 7); //I'm doing a subtring here because I do not want the leading # symbol희망하는 데 도움이됩니다.
gfrobenius

61

대부분의 브라우저는 다음을 사용할 때 RGB 값을 반환하는 것 같습니다.

$('#selector').css('backgroundColor');

IE (지금까지 6 개만 테스트 됨) 만 16 진수 값을 반환합니다.

IE에서 오류 메시지를 피하기 위해 함수를 if 문으로 묶을 수 있습니다.

function rgb2hex(rgb) {
     if (  rgb.search("rgb") == -1 ) {
          return rgb;
     } else {
          rgb = rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+))?\)$/);
          function hex(x) {
               return ("0" + parseInt(x).toString(16)).slice(-2);
          }
          return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]); 
     }
}

1
Jim은 rgba를 고려하기 때문에 대부분의 다른 것보다 잘 작동합니다. 이는 Safari (적어도 Mac OS X에서는)입니다. 고마워요, 짐!
파스칼 Lindelauf

1
훌륭한 솔루션. 이 함수는 소문자, 즉 # FF5544가 아닌 # ff5544를 반환합니다.
피터

이 정규식은 위의 솔루션에서 aplha 채널도 지원합니다. rgb = rgb.match (/ ^ rgba? ((\ d +), \ s * (\ d +), \ s * (\ d +) (? :, \ s * (0 \. \ d +))?) $ /);
Henning Winter

매력처럼 작동
ucMedia

22

rgba 호환성을 위해 @ErickPetru가 업데이트되었습니다.

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

정의 된 경우 알파 값과 일치하도록 정규식을 업데이트했지만 사용하지 않았습니다.


완전성을 위해 : PowerPoint로 내보낼 것 (묻지 마 ...)으로 작업하고 있으며 알파 채널의 16 진수 문자열에서 네 번째 바이트를 허용하므로 다음과 같이 사용할 수 있습니다. return hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]) /* Add the alpha channel if it exists */ + (rgb[5] !== undefined ? hex(Math.round(rgb[5] * 255)) : ''); 또한 #최종 사용을 무시하기 위해 기호를 제거하고 있습니다 ( 0x예 : 출력을 가져 와서 접두사 또는 접두사없이 남겨 둘 수 있음). 그것이 누군가를 돕기를 바랍니다!
Óscar Gómez Alcañiz

10

jQuery를 사용하지 않는 ES6 one liner는 다음과 같습니다.

var rgb = document.querySelector('#selector').style['background-color'];
return '#' + rgb.substr(4, rgb.indexOf(')') - 4).split(',').map((color) => parseInt(color).toString(16)).join('');

1
덕분에 이전 답변에서 정규식 백 슬래시를 제거하는 Wordpress 페이지에 통합 할 수있었습니다.
Jason

5

여기 투명도를 확인하는 버전이 있습니다. 객체가 16 진수 색상의 투명 버전이 실제로 "투명"이라는 스타일 속성에 결과를 삽입했기 때문에 필요했습니다.

function rgb2hex(rgb) {
     if (  rgb.search("rgb") == -1 ) {
          return rgb;
     }
     else if ( rgb == 'rgba(0, 0, 0, 0)' ) {
         return 'transparent';
     }
     else {
          rgb = rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+))?\)$/);
          function hex(x) {
               return ("0" + parseInt(x).toString(16)).slice(-2);
          }
          return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]); 
     }
}

4

요소의 배경색을 16 진수로 반환하는 함수입니다.

function getBgColorHex(elem){
    var color = elem.css('background-color')
    var hex;
    if(color.indexOf('#')>-1){
        //for IE
        hex = color;
    } else {
        var rgb = color.match(/\d+/g);
        hex = '#'+ ('0' + parseInt(rgb[0], 10).toString(16)).slice(-2) + ('0' + parseInt(rgb[1], 10).toString(16)).slice(-2) + ('0' + parseInt(rgb[2], 10).toString(16)).slice(-2);
    }
    return hex;
}

사용 예 :

$('#div1').click(function(){
   alert(getBgColorHex($(this));
}

jsfiddle


4

@Jim F answer 와 같은 대답 이지만 ES6 구문이므로 지침이 적습니다.

const rgb2hex = (rgb) => {
  if (rgb.search("rgb") === -1) return rgb;
  rgb = rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+))?\)$/);
  const hex = (x) => ("0" + parseInt(x).toString(16)).slice(-2);
  return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
};

3

부트 스트랩 색상 선택기에서 가져온 색상 클래스

// Color object
var Color = function(val) {
    this.value = {
        h: 1,
        s: 1,
        b: 1,
        a: 1
    };
    this.setColor(val);
};

Color.prototype = {
    constructor: Color,

    //parse a string to HSB
    setColor: function(val){
        val = val.toLowerCase();
        var that = this;
        $.each( CPGlobal.stringParsers, function( i, parser ) {
            var match = parser.re.exec( val ),
            values = match && parser.parse( match ),
            space = parser.space||'rgba';
            if ( values ) {
                if (space === 'hsla') {
                    that.value = CPGlobal.RGBtoHSB.apply(null, CPGlobal.HSLtoRGB.apply(null, values));
                } else {
                    that.value = CPGlobal.RGBtoHSB.apply(null, values);
                }
                return false;
            }
        });
    },

    setHue: function(h) {
        this.value.h = 1- h;
    },

    setSaturation: function(s) {
        this.value.s = s;
    },

    setLightness: function(b) {
        this.value.b = 1- b;
    },

    setAlpha: function(a) {
        this.value.a = parseInt((1 - a)*100, 10)/100;
    },

    // HSBtoRGB from RaphaelJS
    // https://github.com/DmitryBaranovskiy/raphael/
    toRGB: function(h, s, b, a) {
        if (!h) {
            h = this.value.h;
            s = this.value.s;
            b = this.value.b;
        }
        h *= 360;
        var R, G, B, X, C;
        h = (h % 360) / 60;
        C = b * s;
        X = C * (1 - Math.abs(h % 2 - 1));
        R = G = B = b - C;

        h = ~~h;
        R += [C, X, 0, 0, X, C][h];
        G += [X, C, C, X, 0, 0][h];
        B += [0, 0, X, C, C, X][h];
        return {
            r: Math.round(R*255),
            g: Math.round(G*255),
            b: Math.round(B*255),
            a: a||this.value.a
        };
    },

    toHex: function(h, s, b, a){
        var rgb = this.toRGB(h, s, b, a);
        return '#'+((1 << 24) | (parseInt(rgb.r) << 16) | (parseInt(rgb.g) << 8) | parseInt(rgb.b)).toString(16).substr(1);
    },

    toHSL: function(h, s, b, a){
        if (!h) {
            h = this.value.h;
            s = this.value.s;
            b = this.value.b;
        }
        var H = h,
        L = (2 - s) * b,
        S = s * b;
        if (L > 0 && L <= 1) {
            S /= L;
        } else {
            S /= 2 - L;
        }
        L /= 2;
        if (S > 1) {
            S = 1;
        }
        return {
            h: H,
            s: S,
            l: L,
            a: a||this.value.a
        };
    }
};

사용하는 방법

var color = new Color("RGB(0,5,5)");
color.toHex()

3

읽기 가능 및 정규 표현식 무료 (정규 표현식 없음)

읽을 수있는 기본 함수를 사용하고 정규 표현식을 사용하지 않는 함수를 만들었습니다.
이 함수는 16 진, RGB 또는 rgba CSS 형식의 색상을 허용 하고 16 진 표현을 리턴합니다.
편집 : rgba () 형식을 파싱하는 버그가 수정되었습니다 ...

function getHexColor( color ){
    //if color is already in hex, just return it...
    if( color.indexOf('#') != -1 ) return color;
    
    //leave only "R,G,B" :
    color = color
                .replace("rgba", "") //must go BEFORE rgb replace
                .replace("rgb", "")
                .replace("(", "")
                .replace(")", "");
    color = color.split(","); // get Array["R","G","B"]
    
    // 0) add leading #
    // 1) add leading zero, so we get 0XY or 0X
    // 2) append leading zero with parsed out int value of R/G/B
    //    converted to HEX string representation
    // 3) slice out 2 last chars (get last 2 chars) => 
    //    => we get XY from 0XY and 0X stays the same
    return  "#"
            + ( '0' + parseInt(color[0], 10).toString(16) ).slice(-2)
            + ( '0' + parseInt(color[1], 10).toString(16) ).slice(-2)
            + ( '0' + parseInt(color[2], 10).toString(16) ).slice(-2);
}

1
rgba (0,0,0,0)에서는 작동하지 않습니다. 첫째 : 순서를 변경해야합니다. .replace("rgba", "") .replace("rgb", "") .replace("(", "") .replace(")", "");그렇지 않으면 a0,0,0,0이 남습니다. 그리고 투명 대신 검은 색인 # 000000을 반환합니다.
Twelve24 2016 년

rgba의 4 번째 값이 0이면 해당 'element'에 대한 CSS의 경우 element {color : # 000000, opacity : 0.0;}은 투명하거나 조건부로 'rgba (0,0)를 반환합니다. , 0,0) '호출자로 돌아갑니다.
Twelve24 2016 년

Twelve24 구문 분석 고정 @ - 사실은 확실히 그 :)에 대한 감사 의견을 읽고,하지만 전에 것으로 나타났습니다 투명성에 관해서는이 기능이 반환 HEXA 컬러로 가정된다, 또는 "기본 색상"- - 그래서 한 것을 목적에 :)
jave.web

3

시험

// c - color str e.g."rgb(12,233,43)", result color hex e.g. "#0ce92b"
let rgb2hex= c=> '#'+c.match(/\d+/g).map(x=>(+x).toString(16).padStart(2,0)).join``


2

이것은 조금 더 멋지게 보입니다.

var rgb = $('#selector').css('backgroundColor').match(/\d+/g);
var r   = parseInt(rgb[0], 10);
var g   = parseInt(rgb[1], 10);
var b   = parseInt(rgb[2], 10);
var hex = '#'+ r.toString(16) + g.toString(16) + b.toString(16);

더 간결한 원 라이너 :

var rgb = $('#selector').css('backgroundColor').match(/\d+/g);
var hex = '#'+ Number(rgb[0]).toString(16) + Number(rgb[1]).toString(16) + Number(rgb[2]).toString(16);

jQuery가 항상 16 진을 리턴하도록 강제 :

$.cssHooks.backgroundColor = {
    get: function(elem) {
        if (elem.currentStyle)
            var bg = elem.currentStyle["backgroundColor"];
        else if (window.getComputedStyle) {
            var bg = document.defaultView.getComputedStyle(elem,
                null).getPropertyValue("background-color");
        }
        if (bg.search("rgb") == -1) {
            return bg;
        } else {
            bg = bg.match(/\d+/g);
            function hex(x) {
                return ("0" + parseInt(x).toString(16)).slice(-2);
            }
            return "#" + hex(bg[0]) + hex(bg[1]) + hex(bg[2]);
        }
    }
}

2

위의 @ Justin 's answer에 추가하십시오.

그것은해야한다

var rgb = document.querySelector('#selector').style['background-color'];
return '#' + rgb.substr(4, rgb.indexOf(')') - 4).split(',').map((color) => String("0" + parseInt(color).toString(16)).slice(-2)).join('');

위의 구문 분석 int 함수는 선행 0을 자르기 때문에 5 또는 4 문자의 잘못된 색상 코드를 생성합니다.

감사


1

다음은 IE에서 스크립팅 오류를 발생시키지 않는 해결책입니다. http://haacked.com/archive/2009/12/29/convert-rgb-to-hex.aspx


이전 버전의 IE에서는 jquery를 사용하여 객체의 색상 값을 가져 오면 rgb 대신 16 진수를 반환 할 수 있지만 대부분의 최신 브라우저는 RGB를 반환합니다. 링크 된 함수는 두 가지 사용 사례를 모두 처리합니다.
Paul T

1

Steven Pribilinskiy의 답변은 선행 0을 떨어 뜨립니다. 예를 들어 # ff0000은 # ff00이됩니다.

해결책은 선행 0과 마지막 두 자리에서 부분 문자열을 추가하는 것입니다.

var rgb = $('#selector').css('backgroundColor').match(/\d+/g);
var hex = '#'+ String('0' + Number(rgb[0]).toString(16)).slice(-2) + String('0' + Number(rgb[1]).toString(16)).slice(-2) + String('0' + Number(rgb[2]).toString(16)).slice(-2);

1

질문은 JQuery를 사용했기 때문에 Daniel Elliott의 코드를 기반으로 한 JQuery 플러그인이 있습니다.

$.fn.cssAsHex = function(colorProp) {

    var hexDigits = '0123456789abcdef';

    function hex(x) {
        return isNaN(x) ? '00' : hexDigits[(x - x % 16) / 16] + hexDigits[x % 16];
    };

    // Convert RGB color to Hex format
    function rgb2hex(rgb) {
        var rgbRegex = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
        return '#' + hex(rgbRegex[1]) + hex(rgbRegex[2]) + hex(rgbRegex[3]);
    };

    return rgb2hex(this.css(colorProp));
};

다음과 같이 사용하십시오.

var hexBackgroundColor = $('#myElement').cssAsHex('background-color');

0

여기 내 해결책 은 인수를 사용하여 대문자바꾸고 제공된 문자열에서 다른 가능한 공백과 대문자를 확인합니다.

var a = "rgb(10, 128, 255)";
var b = "rgb( 10, 128, 255)";
var c = "rgb(10, 128, 255 )";
var d = "rgb ( 10, 128, 255 )";
var e = "RGB ( 10, 128, 255 )";
var f = "rgb(10,128,255)";
var g = "rgb(10, 128,)";

var rgbToHex = (function () {
    var rx = /^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i;

    function pad(num) {
        if (num.length === 1) {
            num = "0" + num;
        }

        return num;
    }

    return function (rgb, uppercase) {
        var rxArray = rgb.match(rx),
            hex;

        if (rxArray !== null) {
            hex = pad(parseInt(rxArray[1], 10).toString(16)) + pad(parseInt(rxArray[2], 10).toString(16)) + pad(parseInt(rxArray[3], 10).toString(16));

            if (uppercase === true) {
                hex = hex.toUpperCase();
            }

            return hex;
        }

        return;
    };
}());

console.log(rgbToHex(a));
console.log(rgbToHex(b, true));
console.log(rgbToHex(c));
console.log(rgbToHex(d));
console.log(rgbToHex(e));
console.log(rgbToHex(f));
console.log(rgbToHex(g));

의 위에 jsfiddle

에 속도 비교 jsperf의

또 개선에 수 문자열trim()rgb

var rxArray = rgb.trim().match(rx),

0

나의 아름다운 비표준 솔루션

HTML

<div id="selector" style="background-color:#f5b405"></div>

jQuery

$("#selector").attr("style").replace("background-color:", "");

결과

#f5b405

1
스타일의 모든 것을 반환합니다. : c
Eddie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.