SRGB色彩空间

sRGB色彩空间（standard Red Green Blue，标准红绿蓝色彩空间）是惠普与微软于1996年一起开发的用于显示器、打印机以及因特网的一种标准RGB色彩空间。这种标准得到了W3C、Exif、英特尔、Pantone、Corel以及其它许多业界厂商的支持，在GIMP这样的开放源代码软件也支持这种标准，另外一些专有的或者像SVG这样的开放图形文件格式中也有应用。

sRGB最初设计的目的是作为生成在因特网以及万维网上浏览的图像的通用色彩空间，最后选择的是使用Gamma校准系数为2.2的色彩空间，即CRT显示器在这种情况下的平均线性电压响应。

这里值得重视的是sRGB的设计与当时（1996年）不算理想色彩空间的CRT显示器相匹配。当时大量的专业或者个人电脑软件，使用8位深度的图像文件，并且不经转换就在8位／通道的显示器上显示。许多时髦的非CRT硬件，如LCD、数码相机以及打印机，尽管本身并不生成sRGB曲线，但是都带有补偿电路或者软件以遵循这个标准。在一些高端的专业设备上可能并不遵循这个标准。因此，我们可以假定任何不带颜色配置表或者其它信息的8位图像文件、8位图像API或者设备接口，都处于sRGB色彩空间。

## 综述

sRGB定义了红色、绿色与蓝色三原色的颜色，即在其它两种颜色值都为零时该颜色的最大值。在CIE xy颜色坐标系中红色位于0.6400, 0.3300、绿色位于0.3000, 0.6000、蓝色位于0.1500, 0.0600、白色是位于0.3127,0.3290的D65。对于任何的RGB色彩空间来说，非负的R、G、B都不可能表示超出原色定义的三角形即色域范围，它刚好在人眼的色彩感知范围之内。

sRGB还定义了原色强度与实际保存的数值之间的非线性变换。这个曲线类似于CRT显示器的gamma响应。重现这条曲线要比sRGB图像在显示器上正确显示更加重要。这个非线性变换意味着sRGB非常高效地使图像文件中的整数值表示了人眼可以分辨的颜色。

sRGB由于它的色域不够大，尤其是蓝-绿颜色色域无法表示CMYK印刷中的所有颜色，所以通常印刷行业的专业人员不用这种模型。而Adobe RGB是印刷行业经常使用的色彩空间。

## 变换的规范

### 从CIE xyY或者CIE XYZ到sRGB的前向变换

从CIE xyY坐标系计算sRGB中的三原色首先需要将它变换到CIE XYZ三值模式。

$$X = Y x / y,\,$$

$$Z = Y (1- x - y)/y\,$$

这样XYZ值就可以用矩阵转换到线性的RGB值，这些线性值并不是最终的结果。

$$\begin{bmatrix} R_{linear}\\G_{linear}\\B_{linear}\end{bmatrix}= \begin{bmatrix} 3.2410&-1.5374&-0.4986\\ -0.9692&1.8760&0.0416\\ 0.0556&-0.2040&1.0570 \end{bmatrix} \begin{bmatrix} X \\ Y \\ Z \end{bmatrix}$$

$R_{linear}$、$G_{linear}$与$B_{linear}$的取值范围为0,1。sRGB是反映真实世界gamma为2.2的典型显示器的效果，因此使用下面的变换公式将线性值转换到sRGB。设$C_{linear}$为$R_{linear}$、$G_{linear}$或者$B_{linear}$，$C_{srgb}$为$R_{srgb}$、$G_{srgb}$或者$B_{srgb}$：

- 如果$C_{linear} <= 0.00304\,$则$C_{srgb}=12.92 C_{linear}\,$
- 如果$C_{linear} > 0.00304\,$则$C_{srgb}=(1+a)C_{linear}^{1/2.4}-a\,$
- $$a = 0.055\,$$

这些经过gamma校正的值范围为0到1。如果需要0到255的取值范围，如用于视频显示或者8位图形，通常将它乘以255然后取整。

### 逆向变换

假设sRGB分量的值$R_{srgb}$、$G_{srgb}$、$B_{srgb}$的取值范围为0到1。

$$\begin{bmatrix} X\\Y\\Z\end{bmatrix}= \begin{bmatrix} 0.4124&0.3576&0.1805\\ 0.2126&0.7152&0.0722\\ 0.0193&0.1192&0.9505 \end{bmatrix} \begin{bmatrix} g(R_{srgb})\\ g(G_{srgb})\\ g(B_{srgb})\end{bmatrix}$$

其中

对于$K>0.04045\,$有$g(K) = \left(\frac{K+a}{1+a}\right)^\gamma$

否则$g(K) = \frac{K}{12.92}\,$

## 变换的理论基础

变换的非线性部分是为了逼近2.2的gamma校正而设计的，但是在K=0斜率不为0，这样可能会产生数值计算的问题。对于sRGB变换来说这大致正确。在$K_0$处的g(K)为：

$$\left(\frac{K_0+a}{1+a}\right)^\gamma=\frac{K_0}{\phi}$$

使用上面的标准值$\phi=12.92$，得到$K_0$=0.04045...这就是常用的变换。如果我们要求斜率也要匹配，那么需要：

$$\gamma\left(\frac{K_0+a}{1+a}\right)^{\gamma-1}\left(\frac{1}{1+a}\right)=\frac{1}{\phi}$$

这样就得到两个方程。假设未知变量为$K_0$与$\phi$，这样就得到$K_0$=0.03928...与$\phi$=12.9232.... sRGB规范中有时也使用这些值进行计算，但是它们并不属于标准的一部分。

## 应用

作为因特网上推荐使用的色彩空间，在编辑、保存用于WWW的图像的时候要sRGB标准，但是由于与其它色彩空间相比它的色域较小，因此用于专业印刷的图像如印前输出则可以使用Adobe RGB那样有较大色域的色彩空间。在一些先进的硬件上的另外一种替代方法是仍然使用sRGB原色模式但是使用负值或者超过1的亮度，这样就可以无限扩大色域。

用其它色彩空间生成的用于因特网的图像在使用合适的图像编辑软件进行编辑的时候可以将它们转换成sRGB，这些软件有Corel Paint Shop Pro以及Adobe Photoshop等等。尽管最初的非sRGB文件可以保存并转换为sRGB，但是由于这个转换过程可能会丢失图像信息，所以建议保存为另外的文件以保存原始的非sRGB图像文件。

由于在因特网上的广泛应用，以及许多中低端的消费型数码相机、扫描仪都使用sRGB模型作为缺省模式或者是仅有的色彩空间，同时由于喷墨打印机的应用，因此许多人认为sRGB色彩空间对于家庭应用来说已经足够了。

两种占据主导位置的三维图形编程接口OpenGL与Direct3D都集成有sRGB。OpenGL 2.1中包含有首次在EXT_texture_sRGB扩展中引入的sRGB纹理。OpenGL的EXT_texture_sRGB扩展支持线性或者sRGB色彩空间的渲染缓冲。DirectX 9支持sRGB纹理以及用Direct3D渲染成sRGB表面。

## 参考文献

### 标准

- IEC 61966-2-1:1999 是官方正式的sRGB规范。它定义了查看所需环境、编码以及色度计量的规范。
- A1:2003修正案 针对IEC 61966-2-1:1999描述了YCbCr色彩空间的sYCC编码，扩展色域RGB编码，和CIELAB编码转换。
- sRGB，出自国际色彩联盟
- IEC 61966-2-1 2CD部分的第4版草案 可从网络获取（存档），并非完善的标准
- sRGB.com的网页存档，关于sRGB的设计、准则和使用

## 外部链接

- How to interpret the sRGB color space (specified in IEC 61966-2-1) for ICC profiles
- OpenGL extension for sRGB textures
- Comparison of sRGB and AdobeRGB