Wie erzeuge ich mit PHP hellere/dunklere Farben?

Lesezeit: 8 Minuten

Benutzer-Avatar
eni

Ich habe zum Beispiel einen Hex-Wert einer Farbe #202010.

Wie man eine neue Farbe erzeugt, die entweder heller oder dunkler ist, angegeben in Prozent (z. B. 20 % dunkler) bei PHP?

  • Sie haben diese Frage bereits gestellt, es ist besser, zu versuchen, die Ihnen gegebene Javascript-Lösung zu implementieren und mehr zu dieser Frage zu kommentieren, als eine neue zu beginnen.

    – Kyle

    18. August 2010 um 13:07 Uhr

  • mögliches Duplikat von Generate gradient color from PHP.

    – David Thomas

    18. August 2010 um 13:11 Uhr

  • Wenn Sie dies für eine Webapp/Site tun, bin ich der Meinung, dass die Verwendung von LESS oder SASS und CSS oder Javascript-Methoden effizientere Lösungen wären. Aber meine Perspektive kann verzerrt sein, da ich es bevorzuge, PHP/Knoten/C# usw. zu verwenden, um einen Backend-Dienst zu erstellen, mit dem die Frontend-Techniker interagieren können (im Gegensatz dazu, sie zu einem zusammengewürfelten Ding wie dem alten ASP zu verschmelzen. NET so schmerzlich tut/tat).

    – MER

    24. März 2017 um 20:10 Uhr

  • Auch in der anderen Frage fragte er nach PHP/CSS – nicht nach Javascript.

    – SQLiteNoob

    4. Januar 2018 um 14:55 Uhr

Benutzer-Avatar
Torkil Johnsen

Die prozentuale Anpassung der Farbe, wie im Beispiel von Frxstrem, ist nicht ideal.

Wenn Ihre Farbe Schwarz ist (0,0,0 in RGB), multiplizieren Sie mit Null, was überhaupt keine Änderung ergibt. Wenn Ihre Farbe dunkelgrau ist (z. B. 2,2,2 in RGB), müssen Sie um 50 % aufhellen, um gerade bis zu (3,3,3) zu gelangen. Wenn Sie andererseits eine RGB-Farbe von (100.100.100) haben, wird die Anpassung von 50 % Sie auf (150.150.150) bringen, was im Vergleich eine viel größere Änderung darstellt.

Eine viel bessere Lösung wäre die Anpassung nach Schritt/Zahl (0-255) statt nach Prozent, zum Beispiel so (PHP-Code):

Edit 06.01.2014: Code etwas aufgeräumt.

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

  • Vielen Dank! Hat sich heute als nützlich erwiesen.

    – 472084

    19. Dezember 2012 um 11:07 Uhr

  • Super, ich habe das in meinem WordPress-Theme verwendet!

    – Dafen

    5. November 2013 um 12:05 Uhr

  • Die Schritte können nicht einfach zu jedem Farbwert gleichmäßig hinzugefügt werden, da dies den Farbton der Farbe, mit der Sie arbeiten, verändert. Um denselben Farbton beizubehalten, was das gewünschte Ergebnis ist, muss er ein Bruchteil der R-, G- und B-Werte sein. Das sieht so aus: $r = max(0,min(255,$r + ($r * ($steps / 255))));

    – Wes Cossick

    22. Dezember 2013 um 4:03 Uhr

  • Ihre Erklärung, warum die Multiplikation mit einem Prozentsatz falsch ist, ist genau, wie Photoshop seine Farben ändert, wenn Sie die Helligkeit (HSB) auf variabel einstellen und den Schieberegler von dunkel nach hell auf und ab bewegen. Versuch es. Stellen Sie ein RGB=(127,127,1) ein und das B bleibt in den Grenzen von 0-2, wenn Sie von 0 Helligkeit auf 100 Helligkeit schrubben.

    – Jeff

    13. August 2014 um 20:37 Uhr

  • Vielen Dank! Ich habe nur den Anfang geändert, sodass Sie Prozent anstelle von -255 oder 255 verwenden können. function adjustBrightness($hex, $percent, $darken = true) { $brightness = $darken ? -255 : 255; $steps = $percent*$brightness/100; …. Verwendungszweck: adjustBrightness('#c2002f', 10, false ) Das wird meine Farbe aufhellen.

    – xWaZzo

    17. Mai 2016 um 20:58 Uhr

Benutzer-Avatar
Maliayas

Torkil Johnsens Antwort basiert auf einem festen Schritt, der nicht nur die Helligkeit manipuliert, sondern auch den Farbton leicht ändert. Die Methode von Frxstrem hat auch Mängel, wie Torkil Johnsen feststellte.

Ich habe diesen Ansatz von a übernommen Github-Kommentar und den Code verbessert. Es funktioniert perfekt für jeden Fall.

/**
 * Increases or decreases the brightness of a color by a percentage of the current brightness.
 *
 * @param   string  $hexCode        Supported formats: `#FFF`, `#FFFFFF`, `FFF`, `FFFFFF`
 * @param   float   $adjustPercent  A number between -1 and 1. E.g. 0.3 = 30% lighter; -0.4 = 40% darker.
 *
 * @return  string
 *
 * @author  maliayas
 */
function adjustBrightness($hexCode, $adjustPercent) {
    $hexCode = ltrim($hexCode, '#');

    if (strlen($hexCode) == 3) {
        $hexCode = $hexCode[0] . $hexCode[0] . $hexCode[1] . $hexCode[1] . $hexCode[2] . $hexCode[2];
    }

    $hexCode = array_map('hexdec', str_split($hexCode, 2));

    foreach ($hexCode as & $color) {
        $adjustableLimit = $adjustPercent < 0 ? $color : 255 - $color;
        $adjustAmount = ceil($adjustableLimit * $adjustPercent);

        $color = str_pad(dechex($color + $adjustAmount), 2, '0', STR_PAD_LEFT);
    }

    return '#' . implode($hexCode);
}

Hier ist ein Beispielergebnis:

Beispiel

  • Exzellent! Funktioniert hervorragend mit Kirans TooLightYIQ(hexcolor)-Funktion, hier: Link

    Benutzer2607743

    21. Mai 2019 um 23:20 Uhr


  • Dies ist vielleicht nicht die farblich perfekte Methode, aber für meinen Anwendungsfall reicht es aus UND es ist einfacher, nur eine kurze Funktion 🙂

    – Larzan

    8. Dezember 2019 um 18:14 Uhr

  • Bitte beachten Sie, dass die Dechex-Funktion eine Ganzzahl erfordert und das obige Beispiel einen Float liefert. Dies wird in neueren PHP-Versionen einbrechen.

    – jerome2710

    15. November 2021 um 8:53 Uhr

Benutzer-Avatar
Stange

Die Antworten sind falsch.

Die Verwendung des RGB-Modells ist ein konzeptioneller Fehler.

Sie müssen die Farbe von RGB (oder Hex-Form) in HSL umwandeln.

Das ist Farbton, Sättigung, Helligkeit.

Sobald Sie es von RGB in HSL konvertiert haben, passen Sie einfach den L-Wert (Helligkeit) um 10 % an, um die Farbe aufzuhellen. Dann, wenn Sie fertig sind, konvertieren Sie zurück von HSL zu RGB und Sie sind fertig.

Voila!

RGB zu HSV in PHP

Benutzer-Avatar
Frxstrom

Hier ist ein Beispiel:

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

Extrahieren Sie die Farben. Ich würde es vorziehen, reguläre Ausdrücke zu verwenden, obwohl es wahrscheinlich auch andere, effizientere Möglichkeiten gibt.

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

Jetzt haben wir Rot drin $parts[1]grün ein $parts[2] und blau rein $parts[3]. Konvertieren wir sie nun von Hexadezimalzahlen in Ganzzahlen:

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

Dann verringern wir sie um 20 %:

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

Jetzt wandeln wir sie wieder in Hexadezimalzahlen um und fügen sie unserer Ausgabezeichenfolge hinzu

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

Dann fügen Sie einfach ein “#” an den Anfang der Zeichenfolge, und das war’s!

Das hat mich interessiert, aber meine Frage war wie füge ich ein Opazität zu einer Farbe?

Ich wollte, dass eine Farbe verblasst, nicht heller wird. ich habe das gefunden:
http://www.gidnetwork.com/b-135.html
und es hat großartig funktioniert – Code wurde von der ursprünglichen Website für SO-Leser gepostet.

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( !@preg_match($pattern, $foreground)  or  !@preg_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'] );
}

Benutzer-Avatar
Phönix

Wenn Sie eine einfache Implementierung wünschen und es Ihnen nicht so wichtig ist, dass die Werte speziell über 50% Helligkeit liegen (oder was auch immer Ihr Schwellenwert ist), können Sie meine Lösung für hellere Farben verwenden:

$color = sprintf('#%06X', mt_rand(0xFFFFFF / 1.5, 0xFFFFFF));

Die Idee ist, eine zufällige Farbe im oberen Teil der Palette zu erzeugen. Sie können die Ergebnisse mehr oder weniger dunkel einstellen, indem Sie den Wert “1,5” ändern:

  • größer erweitert die Palette in dunklere Farben
  • kleiner wird es zu helleren Farben zügeln

Sie können dasselbe für dunklere Farben tun, indem Sie den Startpunkt der Zufallsfunktion auf “0x000000” setzen und die Endgrenze teilen:

$color = sprintf('#%06X', mt_rand(0x000000, 0xFFFFFF / 1.5));

Ich weiß, das ist nicht genau, aber es funktioniert für mich.

Benutzer-Avatar
Schlawa

https://github.com/mikeemoo/ColorJizz-PHP Ermöglicht die Konvertierung in HSL, die Änderung der Helligkeitskomponente und die Konvertierung zurück in RGB.

1298300cookie-checkWie erzeuge ich mit PHP hellere/dunklere Farben?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy