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=Yx/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.92C_{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 規範。它定義了檢視所需環境、編碼以及色度計量的規範。
* Amendment A1:2003 to IEC 61966-2-1:1999 describes an analogous sYCC encoding for YCbCr color spaces, an extended-gamut RGB encoding, and a CIELAB transformation.
* The fourth working draft（頁面存檔備份，存於網際網路檔案館） of IEC 61966-2-1 is available online, but is not the complete standard.

## 外部連結

* International Color Consortium（頁面存檔備份，存於網際網路檔案館）
* Basic sRGB Math（ （頁面存檔備份，存於網際網路檔案館））
* A Standard Default Color Space for the Internet - sRGB（頁面存檔備份，存於網際網路檔案館）
* OpenGL extension for sRGB textures
* Comparison of sRGB and AdobeRGB（頁面存檔備份，存於網際網路檔案館）