سؤال

لا أحد يعرف الصيغة الصحيحة للحصول على مستوى التشبع من لون رغب?

لدي بالفعل وظيفة أن يفعل ذلك.لقد حاولت الكثير منهم نشر على شبكة الإنترنت ولكن فقط هذا واحد يبدو للعمل (لأول مرة) بالنسبة لي ، وبصرف النظر عن مستوى التشبع يجري في بعض الأحيان قليلا.

rgb(204,153,51) يجب أن يساوي hsl(40,60,50), ، بدلا من ذلك لدي hsl(40,75,50).كما ترون بلدي هوى وخفة صحيحة ، في الواقع ، والتشبع هو في الغالب الصحيح أيضا ، ولكن في بعض الأحيان انها ليست وأنا بحاجة لتصحيح ذلك إذا استطعت.

هذا هو ما قمت ببنائه حتى الآن ، حتى أتمكن من التحقق من أن جميع قيم الألوان صحيحة لصوري ، قبل تخزينها في قاعدة بيانات لمحرك البحث الخاص بي.

enter image description here

وهذه هي الوظيفة المعنية حيث أعتقد أن التشبع يتم حسابه بشكل غير صحيح:

function RGBtoHSL($red, $green, $blue)
{
    $r = $red / 255.0;
    $g = $green / 255.0;
    $b = $blue / 255.0;
    $H = 0;
    $S = 0;
    $V = 0;

    $min = min($r,$g,$b);
    $max = max($r,$g,$b);
    $delta = ($max - $min);

    $L = ($max + $min) / 2.0;

    if($delta == 0) {
        $H = 0;
        $S = 0;
    } else {
        $S = $delta / $max;

        $dR = ((($max - $r) / 6) + ($delta / 2)) / $delta;
        $dG = ((($max - $g) / 6) + ($delta / 2)) / $delta;
        $dB = ((($max - $b) / 6) + ($delta / 2)) / $delta;

        if ($r == $max)
            $H = $dB - $dG;
        else if($g == $max)
            $H = (1/3) + $dR - $dB;
        else
            $H = (2/3) + $dG - $dR;

        if ($H < 0)
            $H += 1;
        if ($H > 1)
            $H -= 1;
    }
    $HSL = ($H*360).', '.($S*100).', '.round(($L*100),0);
    return $HSL;
}

فكرة واحدة لدي ، لماذا هذا لا يعمل 100 ٪ ، هو أنني أولا تحويل لون عرافة إلى رغب ، ثم رغب إلى هسل.هل ستكون هذه مشكلة بسبب الألوان الآمنة على الويب أم يمكنك اكتشاف أي شيء آخر قد يسبب ذلك في الوظيفة?أم أن هذا فقط كيف هو?

تحديث 1

عند تجربة صور أخرى ، يبدو أنها في الغالب 'بيج' (تقريبا.) الألوان التي هي خارج قليلا على التشبع.باستخدام منتقي الألوان ، إذا قمت بنقل شريط التشبع إلى حيث يجب ألا يكون هناك فرق كبير ، لذلك ربما لن تلتقط ميزة البحث الخاصة بي هذا كثيرا.سيكون من الجميل حلها على الرغم من, قبل أنا تشغيله على 500 ، 000 الصور.

الإصلاح

شكرا ل كلي القدرة, ، أدناه ، لاحظ أنني أفتقد قطعة إلى وظيفتي.لقد تغيرت:

$S = $delta / $max;

إلى:

$S = $L > 0.5 ? $delta / (2 - $max - $min) : $delta / ($max + $min);

وتنتج الآن نتائج صحيحة 100٪.

ملاحظة ودية

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

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

المحلول

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

var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top