Цветовые преобразования схемы OpenXML - применение <a: gamma> и <a: invgamma>

При обработке открытого XML-документа цвета могут иметь различные преобразования, примененные к базовому цвету, для создания относительного цвета. Например <a:satMod value="25000"> изменил бы насыщенность основных цветов на 25%. Мне удалось найти очень мало информации о двух преобразованиях:

<a:gamma> 

В документах сказано: "Этот элемент указывает, что выходной цвет, отображаемый генерирующим приложением, должен быть гамма-сдвигом sRGB входного цвета".

а также

<a:invGamma>

Документы говорят: "Этот элемент указывает, что выходной цвет, отображаемый генерирующим приложением, должен быть обратным гамма-сдвигом sRGB входного цвета".

Я хотел бы понять, что я должен был бы сделать для базового цвета, чтобы преобразовать его, используя любое из этих преобразований. Кто-нибудь понял это?

1 ответ

Решение

Да уж. Проще говоря,

  • <a:gamma> просто означает взять значение sRGB (шкала 0-1) и линеаризовать его (преобразовать в линейный RGB). Возьмите эти линейные значения RGB и сохраните их как sRGB (и конвертируйте в диапазон 0-255, если хотите).
  • <a:invGamma> наоборот - взять линейное значение RGB (шкала 0-1) и обрисовать его в нелинейной форме (преобразовать в sRGB). Возьмите эти линеаризованные значения RGB и сохраните их как sRGB (и конвертируйте в диапазон 0-255, если хотите).

Так что же такое линейный RGB? Расчет здесь на странице sRGB Википедии.

Вот также версия VBA:

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 

value вы передаете компонент R, G, B в диапазоне 0-1, либо sRGB, либо линейный RGB. Вы получите тот же диапазон обратно, 0-1, и в зависимости от ваших потребностей, вы можете затем преобразовать в диапазон 0-255, чтобы построить свой цвет.

Другие вопросы по тегам