Цветовые преобразования схемы 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, чтобы построить свой цвет.