PHP에서 16 진수 색상을 RGB 값으로 변환


82

PHP를 사용하여 16 진수 색상 값을 #ffffff단일 RGB 값으로 변환하는 좋은 방법은 무엇입니까 255 255 255?


그 두 헥스가 같은 유형인가요? 첫 번째는 흰색, 두 번째는 검은 색 ... 뭘하려는 거죠?
BenOfTheNorth 2013 년

$output = sprintf('%06x', 0xffffff - hexdec(ltrim($input, '#'));그러나 그것은 아마도 지나치게 단순화되어 RGB 구성 요소를 개별적으로 분석하고 싶을 것입니다. 원하는 것이 무엇인지 정확히 설명하십시오.
DaveRandom 2013 년

귀하의 타겟 표현 예 (a)는 내가 본 색상의 표현을 형성하지 않으며 (b) "without the #"요구 사항을 충족하지 않습니다 .
Quentin 2013 년

#ffffff그리고 #00000각각 흰색과 검은 색을 나타냅니다. 그리고 yr 정보 #00000는 또한 정수가 아닌 16 진수입니다. 여기에 f15 표현한다
라비

변환 하고 정수만 사용 한다는 것은 무엇을 의미 합니까?
Sverri M. Olsen 2013

답변:


56

PHP hexdec()dechex()기능 확인 : http://php.net/manual/en/function.hexdec.php

예:

$value = hexdec('ff'); // $value = 255

7
이 답변을 사용하여 주어진 16 진수 값에서 rgb로 전체 변환을 수행하려면 다음 중 하나의 옵션이 있습니다. $split_hex_color = str_split( $hex_color, 2 ); $rgb1 = hexdec( $split_hex_color[0] ); $rgb2 = hexdec( $split_hex_color[1] ); $rgb3 = hexdec( $split_hex_color[2] );
thenomadicmann

289

16 진수를 rgb로 변환하려면 sscanf 를 사용할 수 있습니다 .

<?php
$hex = "#ff9900";
list($r, $g, $b) = sscanf($hex, "#%02x%02x%02x");
echo "$hex -> $r $g $b";
?>

산출:

#ff9900 -> 255 153 0

내 질문에서 묻는 것처럼 전환을 할 수있는 것이 있습니까? 내가 가질 수 출력 # 000000 같은
user123_456

14
에 대한 멋진 깔끔한 접근 방식 sscanf(), 나는 마술 트릭 상자에 넣습니다. 불행히도 OP는 당신이하고있는 일과이 아이디어로 어디로 가고 있는지를 파악하기에는 너무 게으른 것처럼 보입니다.
DaveRandom 2013 년

10
및 속기 색상 ( #ccc) : (strlen($hex) === 4) ? list($r, $g, $b) = sscanf($hex, "#%1x%1x%1x") : list($r, $g, $b) = sscanf($hex, "#%2x%2x%2x");
iiic

4
@iiic은 한 줄짜리 테스트를 작성 중입니다. #ccc는 204, 204, 204 대신 12, 12, 12를 반환하므로 16 진수로 되 돌리면 색상 # 0c0c0c가됩니다.
존 Linhart

1
# F0F는 # FF00FF로 변환되므로 속기 색상 list ($ r, $ g, $ b) = sscanf ( '#'. implode ( '', array_map ( 'str_repeat', str_split (str_replace ( '#', '', $ hex)), [2,2,2])), "# % 02x % 02x % 02x");
aconrad

41

알파가 두 번째 매개 변수로 제공되면 알파를 반환하는 함수를 만들었습니다.

함수

function hexToRgb($hex, $alpha = false) {
   $hex      = str_replace('#', '', $hex);
   $length   = strlen($hex);
   $rgb['r'] = hexdec($length == 6 ? substr($hex, 0, 2) : ($length == 3 ? str_repeat(substr($hex, 0, 1), 2) : 0));
   $rgb['g'] = hexdec($length == 6 ? substr($hex, 2, 2) : ($length == 3 ? str_repeat(substr($hex, 1, 1), 2) : 0));
   $rgb['b'] = hexdec($length == 6 ? substr($hex, 4, 2) : ($length == 3 ? str_repeat(substr($hex, 2, 1), 2) : 0));
   if ( $alpha ) {
      $rgb['a'] = $alpha;
   }
   return $rgb;
}

함수 응답의 예

print_r(hexToRgb('#19b698'));
Array (
   [r] => 25
   [g] => 182
   [b] => 152
)

print_r(hexToRgb('19b698'));
Array (
   [r] => 25
   [g] => 182
   [b] => 152
)

print_r(hexToRgb('#19b698', 1));
Array (
   [r] => 25
   [g] => 182
   [b] => 152
   [a] => 1
)

print_r(hexToRgb('#fff'));
Array (
   [r] => 255
   [g] => 255
   [b] => 255
)

rgb (a)를 CSS 형식으로 반환 return $rgb;하려면 함수 의 줄을return implode(array_keys($rgb)) . '(' . implode(', ', $rgb) . ')';


33

관심이있는 사람에게 이것은 매우 간단한 방법입니다. 이 예에서는 정확히 6자가 있고 앞에 파운드 기호가 없다고 가정합니다.

list($r, $g, $b) = array_map('hexdec', str_split($colorName, 2));

다음은 4 가지 입력 (abc, aabbcc, #abc, #aabbcc)을 지원하는 예입니다.

list($r, $g, $b) = array_map(
  function ($c) {
    return hexdec(str_pad($c, 2, $c));
  },
  str_split(ltrim($colorName, '#'), strlen($colorName) > 4 ? 2 : 1)
);

11
사용 ltrim($colorName, '#')하는 대신 $colorName이있을 수 있습니다 경우 # 돌봐
mikeytown2

와우, 당신의 두 번째 코드 줄은 놀랍습니다. #, 아니, 3 개 또는 6 개의 문자를 허용합니다. 이 페이지의 코드 예제 중 가장 좋은 접근 방식이라고 생각합니다. 향후 프로젝트를 위해 이것을 북마크하고 있습니다.
hargobind

14

함수 hexdec(hexStr: String)를 사용하여 16 진 문자열의 10 진수 값을 가져올 수 있습니다 .

예는 아래를 참조하십시오.

$split = str_split("ffffff", 2);
$r = hexdec($split[0]);
$g = hexdec($split[1]);
$b = hexdec($split[2]);
echo "rgb(" . $r . ", " . $g . ", " . $b . ")";

이것은 인쇄됩니다 rgb(255, 255, 255)


이해하고 적용하는 더 쉬운 솔루션. Tks!
Diego Somar

5

해시, 단일 값 또는 쌍 값을 사용하거나 사용하지 않고 16 진수 색상을 처리하는 방법 :

function hex2rgb ( $hex_color ) {
    $values = str_replace( '#', '', $hex_color );
    switch ( strlen( $values ) ) {
        case 3;
            list( $r, $g, $b ) = sscanf( $values, "%1s%1s%1s" );
            return [ hexdec( "$r$r" ), hexdec( "$g$g" ), hexdec( "$b$b" ) ];
        case 6;
            return array_map( 'hexdec', sscanf( $values, "%2s%2s%2s" ) );
        default:
            return false;
    }
}
// returns array(255,68,204)
var_dump( hex2rgb( '#ff44cc' ) );
var_dump( hex2rgb( 'ff44cc' ) );
var_dump( hex2rgb( '#f4c' ) );
var_dump( hex2rgb( 'f4c' ) );
// returns false
var_dump( hex2rgb( '#f4' ) );
var_dump( hex2rgb( 'f489' ) );

5

아래에서이 간단한 코드를 시도해 볼 수 있습니다.

list($r, $g, $b) = sscanf(#7bde84, "#%02x%02x%02x");
echo $r . "," . $g . "," . $b;

그러면 123,222,132가 반환됩니다.


4

색상 코드 HEX를 RGB로 변환

$color = '#ffffff';
$hex = str_replace('#','', $color);
if(strlen($hex) == 3):
   $rgbArray['r'] = hexdec(substr($hex,0,1).substr($hex,0,1));
   $rgbArray['g'] = hexdec(substr($hex,1,1).substr($hex,1,1));
   $rgbArray['b'] = hexdec(substr($hex,2,1).substr($hex,2,1));
else:
   $rgbArray['r'] = hexdec(substr($hex,0,2));
   $rgbArray['g'] = hexdec(substr($hex,2,2));
   $rgbArray['b'] = hexdec(substr($hex,4,2));
endif;

print_r($rgbArray);

산출

Array ( [r] => 255 [g] => 255 [b] => 255 )

나는 여기 에서이 참조를 찾았습니다 -PHP를 사용하여 Color Hex를 RGB로, RGB를 Hex로 변환


3

@John의 답변과 @iic의 코멘트 / 아이디어를 일반적인 16 진수 색상 코드와 속기 색상 코드를 모두 처리 할 수있는 함수에 함께 넣었습니다.

간단한 설명 :

scanf를 사용 하여 16 진수 색상의 r, g 및 b 값을 문자열로 읽습니다. @John의 대답과 같은 16 진수 값이 아닙니다. 속기 색상 코드를 사용하는 경우 r, g 및 b 문자열은 십진수로 변환하기 전에 두 배 ( "f"-> "ff"등)해야합니다.

function hex2rgb($hexColor)
{
  $shorthand = (strlen($hexColor) == 4);

  list($r, $g, $b) = $shorthand? sscanf($hexColor, "#%1s%1s%1s") : sscanf($hexColor, "#%2s%2s%2s");

  return [
    "r" => hexdec($shorthand? "$r$r" : $r),
    "g" => hexdec($shorthand? "$g$g" : $g),
    "b" => hexdec($shorthand? "$b$b" : $b)
  ];
}

0

이것을 시도하면 인수 (r, g, b)를 16 진수 HTML 색상 문자열로 변환합니다. #RRGGBB 인수는 정수로 변환되고 0..255 범위로 잘립니다.

<?php
function rgb2html($r, $g=-1, $b=-1)
{
    if (is_array($r) && sizeof($r) == 3)
        list($r, $g, $b) = $r;

    $r = intval($r); $g = intval($g);
    $b = intval($b);

    $r = dechex($r<0?0:($r>255?255:$r));
    $g = dechex($g<0?0:($g>255?255:$g));
    $b = dechex($b<0?0:($b>255?255:$b));

    $color = (strlen($r) < 2?'0':'').$r;
    $color .= (strlen($g) < 2?'0':'').$g;
    $color .= (strlen($b) < 2?'0':'').$b;
    return '#'.$color;
}
?>

아 그리고 반대 방향

# 처음에있는 문자는 생략 할 수 있습니다. 함수는 범위 (0..255)에있는 세 개의 정수 배열을 반환하거나 색상 형식을 인식하지 못하면 false를 반환합니다.

<?php
function html2rgb($color)
{
    if ($color[0] == '#')
        $color = substr($color, 1);

    if (strlen($color) == 6)
        list($r, $g, $b) = array($color[0].$color[1],
                                 $color[2].$color[3],
                                 $color[4].$color[5]);
    elseif (strlen($color) == 3)
        list($r, $g, $b) = array($color[0].$color[0], $color[1].$color[1], $color[2].$color[2]);
    else
        return false;

    $r = hexdec($r); $g = hexdec($g); $b = hexdec($b);

    return array($r, $g, $b);
}
?>

0
//if u want to convert rgb to hex
$color='254,125,1';
$rgbarr=explode(",", $color);
echo sprintf("#%02x%02x%02x", $rgbarr[0], $rgbarr[1], $rgbarr[2]);

0

이것은 나를 위해 일한 유일한 솔루션입니다. 일부 답변은 일관되지 않았습니다.

    function hex2rgba($color, $opacity = false) {

        $default = 'rgb(0,0,0)';

        //Return default if no color provided
        if(empty($color))
              return $default;

        //Sanitize $color if "#" is provided
            if ($color[0] == '#' ) {
                $color = substr( $color, 1 );
            }

            //Check if color has 6 or 3 characters and get values
            if (strlen($color) == 6) {
                    $hex = array( $color[0] . $color[1], $color[2] . $color[3], $color[4] . $color[5] );
            } elseif ( strlen( $color ) == 3 ) {
                    $hex = array( $color[0] . $color[0], $color[1] . $color[1], $color[2] . $color[2] );
            } else {
                    return $default;
            }

            //Convert hexadec to rgb
            $rgb =  array_map('hexdec', $hex);

            //Check if opacity is set(rgba or rgb)
            if($opacity){
                if(abs($opacity) > 1)
                    $opacity = 1.0;
                $output = 'rgba('.implode(",",$rgb).','.$opacity.')';
            } else {
                $output = 'rgb('.implode(",",$rgb).')';
            }

            //Return rgb(a) color string
            return $output;
    }
    //hex2rgba("#ffaa11",1)

0
function RGB($hex = '')
{
    $hex = str_replace('#', '', $hex);
    if(strlen($hex) > 3) $color = str_split($hex, 2);
    else $color = str_split($hex);
    return [hexdec($color[0]), hexdec($color[1]), hexdec($color[2])];
}

이 코드가 문제를 해결할 수 있지만 문제를 해결하는 방법과 이유에 대한 설명포함 하여 게시물의 품질을 향상시키는 데 실제로 도움이되며 더 많은 찬성 투표가 발생할 수 있습니다. 지금 질문하는 사람뿐만 아니라 미래에 독자를 위해 질문에 답하고 있다는 것을 기억하십시오. 제발 편집 설명을 추가하고 제한 및 가정이 적용 무엇의 표시를 제공하는 답변을.
Dharman

0
Enjoy    

public static function hexColorToRgba($hex, float $a){
        if($a < 0.0 || $a > 1.0){
            $a = 1.0;
        }
        for ($i = 1; $i <= 5; $i = $i+2){
            $rgb[] = hexdec(substr($hex,$i,2));
        }
        return"rgba({$rgb[0]},{$rgb[1]},{$rgb[2]},$a)";
    }

대답 할 때 이것이 선호되는 솔루션 인 이유를 설명하면 훨씬 더 도움이됩니다. 목표는 단순히 특정 문제를 해결하는 것이 아니라 교육하는 것입니다.
The Tin Man

0

내 솔루션 : (짧은 표기법 지원)

$color = "#0ab";
$colort = trim( $color );
if( $colort and is_string( $color ) and preg_match( "~^#?([abcdef0-9]{3}|[abcdef0-9]{6})$~ui", $colort ))
{
    if( preg_match( "~^#?[abcdef0-9]{3}$~ui", $colort ))
    {
        $hex = trim( $colort, "#" );
        list( $hexR, $hexG, $hexB ) = str_split( $hex );
        $hexR .= $hexR;
        $hexG .= $hexG;
        $hexB .= $hexB;
    }
    else
    {
        $hex = trim( $colort, "#" );
        list( $hexR, $hexG, $hexB ) = str_split( $hex, 2 );
    }

    $colorR = hexdec( $hexR );
    $colorG = hexdec( $hexG );
    $colorB = hexdec( $hexB );
}

// Test
echo $colorR ."/" .$colorG ."/" .$colorB;
// → 0/170/187
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.