سؤال

أريد أن يتمكن المستخدمون على موقع الويب الخاص بي من اختيار لون سداسي عشري، وأريد فقط عرض نص أبيض للألوان الداكنة ونص أسود للألوان الفاتحة.هل يمكنك حساب السطوع من خلال رمز سداسي عشري (يفضل PHP)؟

هل كانت مفيدة؟

المحلول

$hex = "78ff2f"; //Bg color in hex, without any prefixing #!

//break up the color in its RGB components
$r = hexdec(substr($hex,0,2));
$g = hexdec(substr($hex,2,2));
$b = hexdec(substr($hex,4,2));

//do simple weighted avarage
//
//(This might be overly simplistic as different colors are perceived
// differently. That is a green of 128 might be brighter than a red of 128.
// But as long as it's just about picking a white or black text color...)
if($r + $g + $b > 382){
    //bright color, use dark font
}else{
    //dark color, use bright font
}

نصائح أخرى

لقد صنعت واحدة مماثلة - ولكن بناءً على أوزان كل لون (بناءً على إصدار C# من هذا الموضوع)

function readableColour($bg){
    $r = hexdec(substr($bg,0,2));
    $g = hexdec(substr($bg,2,2));
    $b = hexdec(substr($bg,4,2));

    $contrast = sqrt(
        $r * $r * .241 +
        $g * $g * .691 +
        $b * $b * .068
    );

    if($contrast > 130){
        return '000000';
    }else{
        return 'FFFFFF';
    }
}

echo readableColour('000000'); // Output - FFFFFF

تعديل: التحسين الصغير: يُعرف SQRT بأنه عملية رياضيات باهظة الثمن ، والتي ربما تكون إهمالًا في معظم السيناريوهات ، ولكن على أي حال ، يمكن تجنبها من خلال القيام بشيء كهذا.

function readableColour($bg){
    $r = hexdec(substr($bg,0,2));
    $g = hexdec(substr($bg,2,2));
    $b = hexdec(substr($bg,4,2));

    $squared_contrast = (
        $r * $r * .299 +
        $g * $g * .587 +
        $b * $b * .114
    );

    if($squared_contrast > pow(130, 2)){
        return '000000';
    }else{
        return 'FFFFFF';
    }
}

echo readableColour('000000'); // Output - FFFFFF

إنه ببساطة لا يطبق SQRT ، بدلاً من ذلك ، يقوم بتشغيل التباين المطلوب من خلال اثنين ، وهو حساب أرخص بكثير

أعلم أن هذا موضوع قديم للغاية ، ولكن بالنسبة للمستخدمين الذين جاءوا من "بحث Google" ، قد يكون هذا الرابط هو ما يبحثون عنه. لقد بحثت عن شيء من هذا القبيل وأعتقد أنه من الجيد نشره هنا:

https://github.com/mexitek/phpcolors

use Mexitek\PHPColors\Color;
// Initialize my color
$myBlue = new Color("#336699");

echo $myBlue->isLight(); // false
echo $myBlue->isDark(); // true

هذا هو.

تحتاج إلى تحويل قيم RGB إلى HLS/HSL (Hue Laffness and Cursation) يمكنك بعد ذلك استخدام الخفة لتحديد ما إذا كنت بحاجة إلى نص إضاءة أو نص مظلم.

هذه الصفحة لديه بعض التفاصيل حول كيفية التحويل في PHP وكذلك اختيار اللون التكميلي من هذا.

لقد رصدت فقط أن الموقع هو موقع تنجسي - لذا أعتذر إذا كان أي شخص يشعر بالإهانة.

إذا قمت بتنشيط ملحق imagemagick، فيمكنك ببساطة إنشاء كائن ImagickPixel، واستدعاء setColor بالقيمة السداسية الخاصة بك، ثم استدعاء getHSL() (والحصول على العنصر الأخير من المصفوفة التي تم الحصول عليها على ما أفترض)...

لقد جربت مقاربة مختلفة في هذا ، استخدمت نسبة الخفة HSL (Hue ، التشبع والخفة) للتحقق مما إذا كان اللون مظلمًا أو خفيفًا. (كما قال chrisf في إجابته)

وظيفة:

function colorislight($hex) {
   $hex       = str_replace('#', '', $hex);
   $r         = (hexdec(substr($hex, 0, 2)) / 255);
   $g         = (hexdec(substr($hex, 2, 2)) / 255);
   $b         = (hexdec(substr($hex, 4, 2)) / 255);
   $lightness = round((((max($r, $g, $b) + min($r, $g, $b)) / 2) * 100));
   return ($lightness >= 50 ? true : false);
}

في خط الإرجاع ، يتحقق ما إذا كانت نسبة الخفة أعلى من 50 ٪ وإعادة إرجاع صحيح وإلا يتم إرجاع خطأ. يمكنك تغييره بسهولة لإرجاع صحيح إذا كان اللون 30 ٪ الخفة وما إلى ذلك. ال $lightness يمكن أن يعود المتغير من 0 إلى 100 0 كونه أحلك و 100 كونه الأخف.

كيفية استخدام الوظيفة:

$color = '#111111';
if ( colorislight($color) ) {
   echo 'this color is light';
}
else {
   echo 'this color is dark';
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top