2010-08-18 26 views
42

Mam wartość szesnastkową jakiegoś koloru, na przykład #202010.Jak wygenerować jaśniejszy/ciemniejszy kolor za pomocą PHP?

Jak wygenerować nowy kolor, który jest jaśniejszy lub ciemniejszy podany w procentach (czyli o 20% ciemniejszy) w PHP?

+3

Już zadałeś to pytanie, lepiej spróbować zaimplementować podane rozwiązanie Javascript i skomentuj więcej na ten temat niż rozpocznij nowe. – Kyle

+0

możliwy duplikat [Generuj kolor gradientu z PHP.] (Http://stackoverflow.com/questions/3511094/generate-gradient-color-from-php) –

+0

Jeśli robisz to dla webapp/witryny jestem zdania, że ​​stosowanie LESS lub SASS i CSS lub metod javascript byłoby bardziej wydajnymi rozwiązaniami. Ale moja perspektywa może być wypaczona, ponieważ wolę PHP/node/C# etc ... do użycia w celu utworzenia usługi backendowej dla front-tech, z którym można się komunikować (w przeciwieństwie do łączenia ich w jedną zmatowioną rzecz jak stara ASP .NET tak boleśnie robi/zrobił). – MER

Odpowiedz

22

Oto przykład:

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

Extract kolory. Wolę używać wyrażeń regularnych, choć prawdopodobnie istnieją inne, bardziej skuteczne sposoby.

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

Teraz mamy w $parts[1] czerwony, zielony i niebieski w $parts[2] w $parts[3]. Załóżmy teraz, konwertować je do liczb całkowitych od szesnastkowym:

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

Potem zmniejszyć je o 20%:

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

teraz będziemy włączyć je z powrotem w systemie szesnastkowym i dodać je do naszej produkcji string

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

Następnie dodaj "#" na początku napisu i gotowe!

+1

do tego właśnie dodałem '#' do $ out = ""; część, więc teraz czyta $ out = "#"; // Przygotuj się do wypełnienia wyników –

105

Regulacja koloru przez procent, jak w przykładzie podanym przez Frxstrem, nie jest idealna.

Jeśli twój kolor jest czarny (0,0,0 w RGB), będziesz mnożyć przez zero, co nie spowoduje żadnej zmiany w ogóle. Jeśli twój kolor jest ciemnoszary (na przykład 2,2,2 w RGB), będziesz musiał rozjaśnić o 50%, aby przejść do poziomu (3,3,3). Z drugiej strony, jeśli masz kolor RGB (100, 100,100), korekta o 50% przeniesie Cię do (150,150,150), co jest znacznie większą zmianą w porównaniu.

Lepszym rozwiązaniem byłoby regulować kroku/nr (0-255) zamiast w procentach, na przykład jak to (PHP) Kod:

Edycja 06.01.2014: Oczyszczone się kod trochę.

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

Dzięki! Przydało się dzisiaj. – 472084

+1

Niesamowita praca, dzięki! – schmatz

+1

Awesome, użyłem tego w moim wordpressowym motywie! – Dafen

15

Odpowiedzi są błędne.

Używanie modelu RGB to błąd koncepcyjny.

Należy przekształcić kolor z RGB (lub formularza Hex) na HSL.

To jest Barwa, Nasycenie, Jasność.

Po konwersji z RGB na HSL, aby rozjaśnić kolor, wystarczy dostosować wartość L (jasność) o 10%. Następnie, gdy skończysz, powrócisz z HSL do RGB i skończysz.

Voila!

RGB to HSV in PHP

+3

+1 za podanie HSL – philipp

3

byłem zainteresowany w tym, ale moje pytanie było jak mogę dodać krycie do koloru?

Chciałem, aby kolor zniknął, a nie lżejszy. znalazłem to: http://www.gidnetwork.com/b-135.html i działało świetnie-kod opublikowany z oryginalnej strony dla czytników 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']); 
} 
Powiązane problemy