سؤال

هل يعرف أحد بطريقة الحصول على HSL من لون Linarrgb (وليس لون SRGB)؟ لقد رأيت الكثير من SRGB <-> تحويلات HSL، ولكن لا شيء ل LINEARRGB <-> HSL. لست متأكدا مما إذا كان من غير الممكن نفس التحويل مع قرص بسيط، لكنني أقدر أي رؤية قد يكون لدى شخص ما على هذا.

Linear RGB ليس هو نفسه SRGB SRGB (الذي يتناول [0،255] وجعله [0،1]). التحول RGB الخطي من / إلى SRGB هو في http://en.wikipedia.org/wiki/srgb.. وبعد في VBA، سيتم التعبير عن هذا (أخذ قيم SRGB الخطية [0،1]):

Public Function sRGB_to_linearRGB(value As Double)
   If value < 0# Then
      sRGB_to_linearRGB = 0#
      Exit Function
   End If
   If value <= 0.04045 Then
      sRGB_to_linearRGB = value / 12.92
      Exit Function
   End If
   If value <= 1# Then
      sRGB_to_linearRGB = ((value + 0.055) / 1.055) ^ 2.4
      Exit Function
   End If
   sRGB_to_linearRGB = 1#
End Function

Public Function linearRGB_to_sRGB(value As Double)
   If value < 0# Then
      linearRGB_to_sRGB = 0#
      Exit Function
   End If
   If value <= 0.0031308 Then
      linearRGB_to_sRGB = value * 12.92
      Exit Function
   End If
   If value < 1# Then
      linearRGB_to_sRGB = 1.055 * (value ^ (1# / 2.4)) - 0.055
      Exit Function
   End If
   linearRGB_to_sRGB = 1#
End Function

لقد حاولت إرسال قيم RGB الخطية إلى إجراءات RGB_TO_HSL القياسية والتراجع من HSL_TO_RGB، لكنها لا تعمل. ربما لأن HSL الحالي HSL <-> حساب خوارزميات RGB تصحيح Gamma و RGB الخطي ليس Gamma - لا أعرف بالضبط. لقد رأيت أي مراجع تقريبا أنه يمكن القيام بذلك، باستثناء اثنين:

  1. مرجع علىhttp://en.wikipedia.org/wiki/hsl_and_hsv#cite_note-9.(البند رقم 10).
  2. مرجع على مشروع مفتوح المصدر GRAFX2 @http://code.google.com/p/grafx2/issues/detail؟id=63#c22.في أيهما الدول المساهم أنه قام بخطية RGB <-> تحويل HSL ويوفر بعض رمز C في مرفق مع تعليقه في ملف .diff (لا أستطيع قراءة حقا :()

نيتي هو:

  1. إرسال من SRGB (على سبيل المثال،FF99FF (R=255, G=153, B=255)) إلى RGB الخطي (R=1.0, G=0.318546778125092, B=1.0)
    • باستخدام التعليمات البرمجية أعلاه (على سبيل المثال، سيتم الحصول على G = 153 في RGB الخطي sRGB_to_linearRGB(153 / 255))
  2. إلى HSL.
  3. تعديل / تعديل التشبع بنسبة 350٪
  4. إرسالها مرة أخرى من HSL-> الخطي RGB-> SRGB، والنتيجة ستكونFF19FF (R=255, G=25, B=255).

باستخدام الوظائف المتاحة من .NET، مثل .getHue من System.Drawing.Color لا يعمل في أي مساحة SRGB أعلى من 100٪ من تعديل أي قيمة HSL، وبالتالي الحاجة إلى إرسال RGB الخطي بدلا من SRGB.

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

المحلول

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

نصائح أخرى

ال system.windows.media.color. تتيح لك الفصل أو تعيين SCRGB عبر SCA أو SCR أو SCG أو خصائص SCB أو RGB عبر خصائص RG و G و B.

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

ليس مثاليا، وقد تنطوي على خسارة المعلومات. لكنه خيار!

بناء على تعليقك هنا, ، مشكلتك لا تفعل التحويل بشكل غير صحيح؛ من ذلك أنك تقوم بإجراء تحويلات متتالية على القيم الكمي. بمعنى آخر، كنت تأخذ نتيجة SRGB => RGB => HSL => HSL => RGB => SRGB واستخدام ذلك في عمليات الألوان اللاحقة. الطريقة الأكثر وضوحا للحفاظ على الدقة هي دائما الحفاظ على قيمة RGB الأصلية وتجميع التغييرات في مساحة HSL التي تريد تطبيقها. بهذه الطريقة، تقوم دائما بتطبيق عمليات الفضاء HSL باللون الأصلي ولا داعي للقلق بشأن معالجة القيم الكمية بشكل متكرر.

هل هذه مساعدة؟ هناك الكثير من الروابط المثيرة للاهتمام في هذا السؤال، ربما شيء يعمل في قضيتك، أيضا ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top