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