2010-08-18 22 views
42

Tôi có giá trị hex của một số màu, ví dụ: #202010.Làm thế nào để tạo ra màu sáng/tối hơn với PHP?

Cách tạo màu mới nhạt hơn hoặc tối hơn theo phần trăm (ví dụ: tối hơn 20%) bằng PHP?

+3

Bạn đã đặt câu hỏi này, tốt hơn là cố gắng triển khai giải pháp Javascript mà bạn đã đưa ra và nhận xét thêm về câu hỏi đó hơn là bắt đầu câu hỏi mới. – Kyle

+0

có thể trùng lặp của [Tạo màu gradient từ PHP.] (Http://stackoverflow.com/questions/3511094/generate-gradient-color-from-php) –

+0

Nếu bạn đang thực hiện việc này cho một ứng dụng web/trang web tôi ý kiến ​​cho rằng sử dụng phương thức LESS hoặc SASS và CSS hoặc javascript sẽ là giải pháp hiệu quả hơn. Nhưng quan điểm của tôi có thể bị sai lệch khi tôi thích PHP/node/C# ... để sử dụng để tạo một dịch vụ phụ trợ cho công nghệ đầu cuối tương tác, (trái ngược với việc làm cho chúng trở thành một thứ bị nhòe như ASP cũ .NET rất đau đớn/đã làm). – MER

Trả lời

22

Dưới đây là một ví dụ:

<?php 
$color = '#aabbcc'; // The color we'll use 

Giải nén màu sắc. Tôi muốn sử dụng các biểu thức thông thường, mặc dù có lẽ cũng có những cách hiệu quả hơn.

if(!preg_match('/^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i', $color, $parts)) 
    die("Not a value color"); 

Bây giờ chúng tôi đã đỏ trong $parts[1], xanh lá cây trong $parts[2] và màu xanh trong $parts[3]. Bây giờ, chúng ta hãy chuyển đổi chúng từ thập lục phân để các số nguyên:

$out = ""; // Prepare to fill with the results 
for($i = 1; $i <= 3; $i++) { 
    $parts[$i] = hexdec($parts[$i]); 

Sau đó, chúng tôi sẽ giảm chúng bằng 20%:

$parts[$i] = round($parts[$i] * 80/100); // 80/100 = 80%, i.e. 20% darker 
    // Increase or decrease it to fit your needs 

Bây giờ, chúng tôi sẽ biến chúng trở lại vào thập lục phân và thêm chúng vào đầu ra của chúng tôi string

$out .= str_pad(dechex($parts[$i]), 2, '0', STR_PAD_LEFT); 
} 

Sau đó chỉ cần thêm dấu "#" vào đầu chuỗi, và đó là nó!

+1

cho điều này tôi chỉ cần thêm '#' vào $ out = ""; một phần để nó bây giờ đọc $ out = "#"; // Chuẩn bị để điền vào các kết quả –

105

Điều chỉnh màu theo phần trăm, như trong ví dụ do Frxstrem đưa ra, không phải là lý tưởng.

Nếu màu của bạn có màu đen (0,0,0 in RGB), bạn sẽ nhân với 0, sẽ không mang lại bất kỳ thay đổi nào cả. Nếu màu của bạn có màu xám đậm (ví dụ 2,2,2 in RGB), bạn sẽ phải làm sáng thêm 50% để di chuyển lên tới (3,3,3). Mặt khác, nếu bạn có một màu RGB (100,100,100), việc điều chỉnh 50% sẽ di chuyển bạn lên đến (150,150,150), đó là một thay đổi lớn hơn nhiều so với.

Một giải pháp tốt hơn sẽ được điều chỉnh bởi bước/số (0-255) thay vì theo phần trăm, ví dụ như thế này (mã PHP):

Sửa 2014/01/06: Làm sạch mã một chút.

function adjustBrightness($hex, $steps) { 
    // Steps should be between -255 and 255. Negative = darker, positive = lighter 
    $steps = max(-255, min(255, $steps)); 

    // Normalize into a six character long hex string 
    $hex = str_replace('#', '', $hex); 
    if (strlen($hex) == 3) { 
     $hex = str_repeat(substr($hex,0,1), 2).str_repeat(substr($hex,1,1), 2).str_repeat(substr($hex,2,1), 2); 
    } 

    // Split into three parts: R, G and B 
    $color_parts = str_split($hex, 2); 
    $return = '#'; 

    foreach ($color_parts as $color) { 
     $color = hexdec($color); // Convert to decimal 
     $color = max(0,min(255,$color + $steps)); // Adjust color 
     $return .= str_pad(dechex($color), 2, '0', STR_PAD_LEFT); // Make two char hex code 
    } 

    return $return; 
} 
+1

Cảm ơn! Đến hôm nay tiện dụng. – 472084

+1

Công việc tuyệt vời, cảm ơn! – schmatz

+1

Tuyệt vời, tôi đã sử dụng nó trong chủ đề wordpress của mình! – Dafen

15

Câu trả lời sai.

Sử dụng mô hình RGB là lỗi khái niệm.

Bạn cần chuyển đổi màu từ RGB (hoặc dạng Hex) thành HSL.

Đó là Hue, Saturation, Lightness.

Khi bạn chuyển đổi từ RGB thành HSL, để làm sáng màu bạn chỉ cần điều chỉnh giá trị L (độ sáng) 10%. Sau đó, một khi bạn đã hoàn tất, bạn chuyển đổi từ HSL sang RGB và bạn đã hoàn tất.

Thì đấy!

RGB to HSV in PHP

+3

+1 để đề cập đến HSL – philipp

3

tôi đã quan tâm đến điều này, nhưng câu hỏi của tôi là làm thế nào để thêm một opacity đến một màu sắc?

Tôi muốn màu nhạt dần, không được làm sáng hơn. tôi đã tìm thấy điều này: http://www.gidnetwork.com/b-135.html và nó đã hoạt động tuyệt vời được đăng từ trang gốc cho người đọc SO.

function color_blend_by_opacity($foreground, $opacity, $background=null) 
{ 
    static $colors_rgb=array(); // stores colour values already passed through the hexdec() functions below. 
    $foreground = str_replace('#','',$foreground); 
    if(is_null($background)) 
     $background = 'FFFFFF'; // default background. 

    $pattern = '~^[a-f0-9]{6,6}$~i'; // accept only valid hexadecimal colour values. 
    if([email protected]_match($pattern, $foreground) or [email protected]_match($pattern, $background)) 
    { 
     trigger_error("Invalid hexadecimal colour value(s) found", E_USER_WARNING); 
     return false; 
    } 

    $opacity = intval($opacity); // validate opacity data/number. 
    if($opacity>100 || $opacity<0) 
    { 
     trigger_error("Opacity percentage error, valid numbers are between 0 - 100", E_USER_WARNING); 
     return false; 
    } 

    if($opacity==100) // $transparency == 0 
     return strtoupper($foreground); 
    if($opacity==0) // $transparency == 100 
     return strtoupper($background); 
    // calculate $transparency value. 
    $transparency = 100-$opacity; 

    if(!isset($colors_rgb[$foreground])) 
    { // do this only ONCE per script, for each unique colour. 
     $f = array( 'r'=>hexdec($foreground[0].$foreground[1]), 
        'g'=>hexdec($foreground[2].$foreground[3]), 
        'b'=>hexdec($foreground[4].$foreground[5]) ); 
     $colors_rgb[$foreground] = $f; 
    } 
    else 
    { // if this function is used 100 times in a script, this block is run 99 times. Efficient. 
     $f = $colors_rgb[$foreground]; 
    } 

    if(!isset($colors_rgb[$background])) 
    { // do this only ONCE per script, for each unique colour. 
     $b = array( 'r'=>hexdec($background[0].$background[1]), 
        'g'=>hexdec($background[2].$background[3]), 
        'b'=>hexdec($background[4].$background[5]) ); 
     $colors_rgb[$background] = $b; 
    } 
    else 
    { // if this FUNCTION is used 100 times in a SCRIPT, this block will run 99 times. Efficient. 
     $b = $colors_rgb[$background]; 
    } 

    $add = array( 'r'=>($b['r']-$f['r'])/100, 
        'g'=>($b['g']-$f['g'])/100, 
        'b'=>($b['b']-$f['b'])/100 ); 

    $f['r'] += intval($add['r'] * $transparency); 
    $f['g'] += intval($add['g'] * $transparency); 
    $f['b'] += intval($add['b'] * $transparency); 

    return sprintf('%02X%02X%02X', $f['r'], $f['g'], $f['b']); 
} 
Các vấn đề liên quan