2010-08-18 10 views
42

मेरे पास कुछ रंग का हेक्स मान है, उदाहरण के लिए #202010PHP के साथ हल्का/गहरा रंग कैसे उत्पन्न करें?

PHP में (यानी 20% गहरा) में कोई नया रंग उत्पन्न करने वाला हल्का या गहराई कैसे उत्पन्न करें?

+3

आप पहले से ही इस सवाल से पूछा गया है कि आपको दिए गए जावास्क्रिप्ट समाधान को लागू करने का प्रयास करने के लिए बेहतर है और एक नया शुरू करने के बजाय उस प्रश्न पर और टिप्पणी करें। की – Kyle

+0

संभव डुप्लिकेट [PHP से ढाल रंग उत्पन्न करें।] (http://stackoverflow.com/questions/3511094/generate-gradient-color-from-php) –

+0

आप एक webapp/साइट मैं के लिए यह कर रहे हैं कम या एसएएसएस और सीएसएस, या जावास्क्रिप्ट विधियों का उपयोग करने की राय के मुताबिक, अधिक कुशल समाधान होंगे। लेकिन मेरा परिप्रेक्ष्य खराब हो सकता है क्योंकि मैं PHP/नोड/सी # आदि पसंद करता हूं ... फ्रंट एंड तकनीक के साथ बातचीत करने के लिए बैकएंड सेवा बनाने के लिए उपयोग किया जा सकता है, (पुराने एएसपी जैसे एक मशहूर चीज में उन्हें उलझाने के विपरीत .NET इतनी दर्दनाक करता है/करता है)। – MER

उत्तर

22

यहाँ एक उदाहरण है:

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

रंग निकालें। मैं नियमित अभिव्यक्तियों का उपयोग करना पसंद करूंगा, हालांकि शायद अन्य अधिक कुशल तरीके भी हैं।

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

अब हम $parts[1] में लाल है, $parts[2] में हरे और $parts[3] में नीले रंग। हम हेक्साडेसिमल में वापस उन्हें बदल देंगे

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

अब, और उन्हें हमारे उत्पादन के लिए जोड़ें: अब, चलो पूर्णांकों को हेक्साडेसिमल से उन्हें बदलने करते हैं:

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

तो हम उन्हें 20% से कम हो जाएगा स्ट्रिंग

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

फिर स्ट्रिंग की शुरुआत में "#" जोड़ें, और यही वह है!

+1

मैंने अभी '#' को $ out = "" में जोड़ा है; भाग तो अब यह $ out = "#" पढ़ता है; // परिणाम –

105

फ्रेक्सस्ट्रैम द्वारा दिए गए उदाहरण में प्रतिशत के अनुसार रंग समायोजित करना आदर्श नहीं है।

यदि आपका रंग काला है (आरजीबी में 0,0,0), तो आप शून्य से गुणा करेंगे, जिससे कोई भी बदलाव नहीं आएगा। यदि आपका रंग गहरा भूरा है (उदाहरण के लिए आरजीबी में 2,2,2), तो आपको केवल (3,3,3) तक जाने के लिए 50% तक हल्का करना होगा। दूसरी तरफ, यदि आपके पास आरजीबी रंग (100,100,100) है, तो 50% का समायोजन आपको (150,150,150) तक ले जाएगा, जो तुलना में एक बड़ा बदलाव है।

संपादित 2014-01-06:

एक बहुत बेहतर समाधान इस (PHP कोड) जैसे उदाहरण के लिए बजाय प्रतिशत के कदम/संख्या (0-255) द्वारा समायोजित करने के लिए, हो सकता है कोड को साफ़ किया एक सा।

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

के साथ भरने के लिए तैयार धन्यवाद! आज काम में आया था। – 472084

+1

बहुत बढ़िया काम, धन्यवाद! – schmatz

+1

बहुत बढ़िया, मैंने इसे अपने WordPress विषय में इस्तेमाल किया! – Dafen

15

उत्तर गलत हैं।

आरजीबी मॉडल का उपयोग एक वैचारिक त्रुटि है।

आपको रंग को आरजीबी (या हेक्स फॉर्म) से एचएसएल में बदलने की जरूरत है।

यह ह्यू, संतृप्ति, हल्कापन है।

एक बार जब आप इसे आरजीबी से एचएसएल में परिवर्तित कर देते हैं, तो रंग को हल्का करने के लिए आप आसानी से एल मान (हल्कापन) को 10% तक समायोजित करते हैं। फिर एक बार जब आप कर लेंगे तो आप एचएसएल से आरजीबी में वापस कन्वर्ट करें और आप कर लेंगे।

वोला!

RGB to HSV in PHP

+3

+1 – philipp

3

मैं इस में रुचि थी, लेकिन मेरे सवाल का कैसे मैं एक रंग करने के लिए एक अस्पष्टता में शामिल कर सकता था?

मैं फीका करने के लिए हल्का नहीं किया एक रंग चाहता था। मैंने यह पाया: http://www.gidnetwork.com/b-135.html और यह एसओ पाठकों के लिए मूल साइट से पोस्ट किया गया महान कोड काम करता है।

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

https://github.com/mikeemoo/ColorJizz-PHP एचएसएल में बदलने का, हल्कापन घटक बदल सकते हैं और वापस आरजीबी कन्वर्ट करने के लिए अनुमति देता है।

संबंधित मुद्दे