OpenXML方案颜色转换 - 应用<a:gamma>和<a:invgamma> </a:invgamma> </a:gamma>

时间:2010-10-22 22:03:40

标签: c# openxml drawingml

处理打开的xml文档时,颜色可以将各种变换应用于基色以生成相对颜色。例如<a:satMod value="25000">会将基色饱和度修改25%。有两个转换我能找到很少的信息,它们是:

<a:gamma> 

文档说“此元素指定生成应用程序呈现的输出颜色应为输入颜色的sRGB伽玛偏移。”

<a:invGamma>

文档说“这个元素指定生成应用程序呈现的输出颜色应该是输入颜色的反向sRGB伽玛移位。”

我想了解我必须对基色进行什么计算才能使用这些变换进行变换。有人想出来了吗?

1 个答案:

答案 0 :(得分:2)

呀。简单地说,

  • <a:gamma>只是意味着获取sRGB值(0-1比例)并将其线性化(转换为线性RGB)。获取这些线性RGB值并将其保存为sRGB(如果需要,可将其转换为0-255范围)。
  • <a:invGamma>正好相反 - 采用线性RGB值(0-1比例)并对其进行去线性化(转换为sRGB)。取这些去线性化的RGB值并将它们保存为sRGB(如果需要,可将其转换为0-255范围)。

那么什么是线性RGB?计算结果为here on Wikipedia's sRGB page

这里也是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是0-1范围内的R,G,B分量,sRGB或线性RGB。您将收到相同的范围,0-1,根据您的需要,您可以转换为0-255范围来构建您的颜色。