Chuyển đổi màu hex sang giá trị RGB trong PHP


82

Cách tốt để chuyển đổi các giá trị màu hex #ffffffthành các giá trị RGB đơn lẻ 255 255 255bằng PHP là gì?


Hai hex's đó là cùng một loại? Đầu tiên là màu trắng, màu đen thứ hai ... bạn đang cố gắng làm gì?
BenOfTheNorth

$output = sprintf('%06x', 0xffffff - hexdec(ltrim($input, '#'));tuy nhiên điều đó có thể được đơn giản hóa quá mức và có thể bạn sẽ muốn phân tích các thành phần RGB một cách riêng biệt, vui lòng giải thích chính xác những gì bạn muốn làm.
DaveRandom

Ví dụ đại diện mục tiêu của bạn (a) không hình thành bất kỳ biểu thị màu nào mà tôi đã thấy và (b) không đáp ứng yêu cầu "không có" của bạn #.
Quentin

#ffffff#00000đại diện cho Trắng và Đen tương ứng. Và đối với thông tin năm #00000cũng là một Hex không phải là một số nguyên. Đây flà đại diện cho ngày 15.
Ravi

Ý bạn là gì khi chuyển đổichỉ sử dụng một số nguyên ?
Sverri M. Olsen

Câu trả lời:


56

Kiểm tra các chức năng hexdec()và của PHP dechex(): http://php.net/manual/en/ Chức năng.hexdec.php

Thí dụ:

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

7
Để sử dụng câu trả lời này để làm một sự chuyển đổi đầy đủ từ một giá trị hex cho rgb, một lựa chọn là những điều sau đây: $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

Nếu bạn muốn chuyển đổi hex sang rgb, bạn có thể sử dụng sscanf :

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

Đầu ra:

#ff9900 -> 255 153 0

Có điều gì để tôi có thể chuyển đổi như tôi đã hỏi trong câu hỏi của mình không? Tôi có thể có đầu ra như # 000000
user123_456 Ngày

14
Cách tiếp cận sạch đẹp với sscanf(), tôi đang đặt nó vào hộp các trò ảo thuật của mình. Thật không may, có vẻ như OP quá lười biếng để tìm ra những gì bạn đang làm và bạn sẽ đi đâu với ý tưởng này.
DaveRandom

10
và đối với các màu viết tắt ( #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 vừa viết test cho one-liner của bạn. #ccc sẽ trả về 12, 12, 12 thay vì 204, 204, 204, vì vậy nếu bạn chuyển nó trở lại thành hex, bạn sẽ nhận được màu # 0c0c0c.
John Linhart

1
# F0F dịch thành # FF00FF nên đối với danh sách màu viết tắt ($ r, $ g, $ b) = sscanf ('#'. Implode ('', array_map ('str_repeat', str_split (str_replace ('#', '',)) $ hex)), [2,2,2])), "#% 02x% 02x% 02x");
aconrad

41

Tôi đã tạo một hàm cũng trả về alpha nếu alpha được cung cấp dưới dạng tham số thứ hai, mã bên dưới.

Chức năng

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;
}

Ví dụ về phản hồi chức năng

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
)

Nếu bạn muốn trả về rgb (a) ở định dạng CSS, chỉ cần thay thế return $rgb;dòng trong hàm bằngreturn implode(array_keys($rgb)) . '(' . implode(', ', $rgb) . ')';


33

Đối với bất kỳ ai quan tâm, đây là một cách làm rất đơn giản khác. Ví dụ này giả sử có chính xác 6 ký tự và không có dấu thăng đứng trước.

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

Đây là một ví dụ hỗ trợ 4 đầu vào khác nhau (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
Sử dụng ltrim($colorName, '#')thay vì $colorNameđể chăm sóc một # nếu nó có thể có mặt ở đó
mikeytown2

Chà, dòng mã thứ 2 của bạn thật tuyệt vời ... nó chấp nhận # hoặc không, và 3 hoặc 6 ký tự. Tôi nghĩ đó là cách tiếp cận tốt nhất của bất kỳ ví dụ mã nào trên trang này. Tôi đánh dấu trang này cho các dự án trong tương lai.
hargobind

14

Bạn có thể sử dụng hàm hexdec(hexStr: String)để lấy giá trị thập phân của chuỗi thập lục phân.

Xem ví dụ bên dưới:

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

Điều này sẽ in rgb(255, 255, 255)


Giải pháp dễ dàng hơn để hiểu và áp dụng. Tks!
Diego Somar

5

Cách tiếp cận của tôi để quan tâm đến các màu hex có hoặc không có hàm băm, giá trị đơn lẻ hoặc giá trị cặp:

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

Bạn có thể thử đoạn mã đơn giản này bên dưới.

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

Điều này sẽ trả về 123,222,132


4

Chuyển đổi mã màu HEX sang 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);

Đầu ra

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

Tôi đã tìm thấy tài liệu tham khảo này từ đây - Chuyển đổi Color Hex sang RGB và RGB sang Hex bằng PHP


3

Tôi đã đặt câu trả lời của @ John và nhận xét / ý tưởng của @ iic lại với nhau thành một hàm có thể xử lý cả hai, mã màu hex thông thường và mã màu viết tắt.

Giải thích ngắn gọn:

Với scanf, tôi đọc các giá trị r, g và b từ màu hex dưới dạng chuỗi. Không phải là giá trị hex như trong câu trả lời của @ John. Trong trường hợp sử dụng mã màu viết tắt, các chuỗi r, g và b phải được nhân đôi ("f" -> "ff", v.v.) trước khi chuyển chúng thành số thập phân.

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

hãy thử điều này, nó chuyển đổi các đối số của nó (r, g, b) thành chuỗi màu html thập lục phân #RRGGBB Các đối số được chuyển đổi thành số nguyên và được cắt thành phạm vi 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;
}
?>

oh và ngược lại

# ký tự ở đầu có thể được bỏ qua. Hàm trả về mảng ba số nguyên trong phạm vi (0..255) hoặc false khi nó không nhận dạng được định dạng màu.

<?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

Đây là giải pháp duy nhất làm việc cho tôi. Một số câu trả lời không đủ nhất quán.

    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])];
}

Mặc dù mã này có thể giải quyết câu hỏi, bao gồm giải thích về cách thức và lý do tại sao điều này giải quyết vấn đề sẽ thực sự giúp cải thiện chất lượng bài đăng của bạn và có thể dẫn đến nhiều phiếu bầu hơn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai, không chỉ người hỏi bây giờ. Vui lòng chỉnh sửa câu trả lời của bạn để thêm giải thích và đưa ra dấu hiệu về những giới hạn và giả định áp dụng.
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)";
    }

Khi trả lời, sẽ hữu ích hơn nhiều nếu bạn giải thích tại sao đây là giải pháp ưu tiên. Mục đích là để giáo dục chứ không chỉ đơn thuần là giải quyết một vấn đề cụ thể.
the Tin Man

0

Giải pháp của tôi: (Hỗ trợ ký hiệu ngắn)

$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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.