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?
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?
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
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:
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
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
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'] );
}
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:
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.
Schlawa
https://github.com/mikeemoo/ColorJizz-PHP Ermöglicht die Konvertierung in HSL, die Änderung der Helligkeitskomponente und die Konvertierung zurück in RGB.
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