Вопрос

Кто-нибудь знает способ получить HSL из цвета linearRGB (не цвета sRGB)?Я видел много sRGB<-> Преобразования HSL, но ничего для linearRGB<->HSL.Не уверен, что это фундаментально такое же преобразование с незначительными изменениями, но я был бы признателен за любую информацию, которая у кого-то может быть по этому поводу.

Линейный RGB - это не то же самое, что линеаризация 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_SL и обратно из HSL_to_RGB, но это не работает.Может быть, потому, что текущий HSL<-> Алгоритмы RGB учитывают гамма-коррекцию, а линейный RGB не имеет гамма-коррекции - я точно не знаю.Я не видел почти никаких ссылок на то, что это можно сделать, за исключением двух:

  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-> Linear RGB-> sRGB, результат был бы FF19FF (R=255, G=25, B=255).

Используя доступные функции из .NET, такие как .getHue из a System.Drawing.Color не работает ни в одном пространстве sRGB с модуляцией выше 100% любого значения HSL, следовательно, необходимо передавать линейный RGB вместо sRGB.

Это было полезно?

Решение

Нет особого смысла преобразовывать в линейный RGB, поскольку HSL определяется в терминах значений, закодированных в гамме.Вместо этого напишите свою собственную функцию convert sRGB в HSL, модулируйте насыщенность этими значениями (допуская потенциально выходящие за пределы гаммы значения насыщенности), а затем преобразуйте обратно в sRGB, фиксируя интенсивности, которые выходят за пределы диапазона sRGB (или запрещая изменения насыщенности, которые не могут быть закодированы в sRGB).

Другие советы

В Система.Windows.Медиафайлы.Цвет класс позволяет получить или установить scRGB через свойства ScA, ScR, ScG, ScB или RGB через свойства A, R, G, B.

Таким образом, вы могли бы преобразовать RGB в HSL, манипулировать этим, затем преобразовать обратно в RGB и сохранить в экземпляре Color.Затем вы можете прочитать преобразованные свойства scRGB.

Не идеально и может повлечь за собой некоторую потерю информации.Но это вариант!

Основываясь на вашем комментарии здесь, ваша проблема не в неправильном преобразовании;дело в том, что вы выполняете последовательные преобразования квантованных значений.Другими словами, вы берете результат sRGB=> RGB=>HSL=>HSL=> RGB=> sRGB и используете его в последующих операциях с цветом.Самый простой способ сохранить точность - всегда придерживаться исходного значения RGB и накапливать изменения в пространстве HSL, которые вы хотите применить.Таким образом, вы всегда применяете операции с пробелами HSL к исходному цвету, и вам не нужно беспокоиться о повторной обработке квантованных значений.

Делает это помочь?В этом вопросе есть много интересных ссылок, возможно, что-то, что сработает и в вашем случае...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top