日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

几种颜色模型的转换公式

發布時間:2025/7/25 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 几种颜色模型的转换公式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

from: 幾種顏色模型的轉換公式


在做圖像處理時,我們一般采用的是RGB空間,但是在某些特殊情況下,我們也會用到其他的顏色空間。本文主要介紹一些常見的顏色空間的概念和轉換公式。

顏色的實質是一種光波。它的存在是因為有三個實體:光線、被觀察的對象以及觀察者。人眼是把顏色當作由被觀察對象吸收或者反射不同波長的光波形成的。例如,當在一個晴朗的日子里,我們看到陽光下的某物體呈現紅色時,那是因為該物體吸收了其它波長的光,而把紅色波長的光反射到我們人眼里的緣故。當然,我們人眼所能感受到的只是波長在可見光范圍內的光波信號。當各種不同波長的光信號一同進入我們的眼睛的某一點時,我們的視覺器官會將它們混合起來,作為一種顏色接受下來。同樣我們在對圖像進行顏色處理時,也要進行顏色的混合,但我們要遵循一定的規則,即我們是在不同顏色模式下對顏色進行處理的。

1.RGB顏色模式

  雖然可見光的波長有一定的范圍,但我們在處理顏色時并不需要將每一種波長的顏色都單獨表示。因為自然界中所有的顏色都可以用紅、綠、藍(RGB)這三種顏色波長的不同強度組合而得,這就是人們常說的三基色原理。因此,這三種光常被人們稱為三基色或三原色。有時候我們亦稱這三種基色為添加色(Additive Colors),這是因為當我們把不同光的波長加到一起的時候,得到的將會是更加明亮的顏色。把三種基色交互重疊,就產生了次混合色:青(Cyan)、洋紅(Magenta)、黃(Yellow)。這同時也引出了互補色(Complement Colors)的概念。基色和次混合色是彼此的互補色,即彼此之間最不一樣的顏色。例如青色由藍色和綠色構成,而紅色是缺少的一種顏色,因此青色和紅色構成了彼此的互補色。在數字視頻中,對RGB三基色各進行8位編碼就構成了大約16.7萬種顏色,這就是我們常說的真彩色。順便提一句,電視機和計算機的監視器都是基于RGB顏色模式來創建其顏色的。

2.Lab顏色模式

  Lab顏色是由RGB三基色轉換而來的,它是由RGB模式轉換為HSB模式和CMYK模式的橋梁。該顏色模式由一個發光率(Luminance)和兩個顏色(a,b)軸組成。它由顏色軸所構成的平面上的環形線來表示顏色的變化,其中徑向表示色飽和度的變化,自內向外,飽和度逐漸增高;圓周方向表示色調的變化,每個圓周形成一個色環;而不同的發光率表示不同的亮度并對應不同環形顏色變化線。它是一種具有“獨立于設備”的顏色模式,即不論使用任何一種監視器或者打印機,Lab的顏色不變。

RGB=>Lab

|X| |0.433910 0.376220 0.189860| |R/255| |Y| = |0.212649 0.715169 0.072182|*|G/255| |Z| |0.017756 0.109478 0.872915| |B/255|L = 116*Y1/3 for Y>0.008856 L = 903.3*Y for Y<=0.008856a = 500*(f(X)-f(Y)) b = 200*(f(Y)-f(Z)) 其中 f(t)=t1/3 for t>0.008856f(t)=7.787*t+16/116 for t<=0.008856

3.HSB顏色模式

  從心理學的角度來看,顏色有三個要素:色澤(Hue)、飽和度(Saturation)和亮度(Brightness)。HSB顏色模式便是基于人對顏色的心理感受的一種顏色模式。它是由RGB三基色轉換為Lab模式,再在Lab模式的基礎上考慮了人對顏色的心理感受這一因素而轉換成的。因此這種顏色模式比較符合人的視覺感受,讓人覺得更加直觀一些。它可由底與底對接的兩個圓錐體立體模型來表示,其中軸向表示亮度,自上而下由白變黑;徑向表示色飽和度,自內向外逐漸變高;而圓周方向,則表示色調的變化,形成色環。

RGB=>HSB

V=max(R,G,B) S=(V-min(R,G,B))*255/V if V!=0, 0 otherwise(G - B)*60/S, if V=R H= 180+(B - R)*60/S, if V=G240+(R - G)*60/S, if V=B若 H<0,則 H=H+360

使用上面從 0° 到 360° 變化的公式計算色調( hue)值,確保它們被 2 除后能試用于8位。

4.YUV顏色模式

  這是電視系統中常用的顏色模式,即電視中所謂的分量(Component)信號。該模式由一個亮度信號Y和兩個色差信號U、V組成。它是利用了人眼對亮度信號敏感而對色度信號相對不敏感的特點,將RGB顏色通過亮度信號公式Y=039R+050G+011B轉換為一個亮度信號Y和兩個色差分量信號U(R-Y)、V(B-Y),即對色差信號進行了頻帶壓縮。毫無疑問,這是以犧牲信號的質量為代價的。

RGB<=>YUV Y = 0.299R + 0.587G + 0.114B U = -0.147R - 0.289G + 0.436B V = 0.615R - 0.515G - 0.100BR = Y + 1.14V G = Y - 0.39U - 0.58V B = Y + 2.03U

5.CMYK顏色模式

  這是彩色印刷使用的一種顏色模式。它由青(Cyan)、洋紅(Magenta)、黃(Yellow)和黑(Black)四種顏色組成。其中黑色之所以用K來表示,是為避免和RGB三基色中的藍色(Blue,用B表示)發生混淆。該種模式的創建基礎和RGB不同,它不是靠增加光線,而是靠減去光線,因為和監視器或者電視機不同的是,打印紙不能創建光源,它不會發射光線,只能吸收和反射光線。因此通過對上述四種顏色的組合,便可以產生可見光譜中的絕大部分顏色了。

RGB<=CMYK

?? R = (255 - C) * ((255 - K) / 255)
??? G = (255 - M) * ((255 - K) / 255)
??? B = (255 - Y) * ((255 - K) / 255)


6.部分程序code

void HSI2RGB(BYTE &BR,BYTE &BG,BYTE &BB,BYTE BH,BYTE BS,BYTE BI)
{
int nHValue = static_cast<int>(BH);
int nSValue = static_cast<int>(BS);
int nLValue = static_cast<int>(BI);

float fHAngle = ((float)nHValue ) / 255 * 360;

float H = fHAngle / 180 * PI;
float S = ((float)nSValue ) / 100;
float I = ((float)nLValue ) / 100;

float R = -1;
float G = -1;
float B = -1;

if(fHAngle >= 0 && fHAngle < 120)
{
? B = I * ( 1.0 - S );
? R = I * ( 1.0 + ( S * cos( H ) / cos( 60.0 / 180 * PI - H ) ) );
? G = 3.0 * I - ( B + R );
}
else if(fHAngle >= 120 && fHAngle < 240)
{
? R = I * ( 1.0 - S );
? G = I * ( 1.0 + S * cos( H - 120.0 / 180 * PI ) / cos( 180.0 / 180 * PI - H )? );
? B = 3.0 * I - ( R + G );
}
else if(fHAngle >= 240 && fHAngle < 360)
{
? G = I * ( 1.0 - S );
? B = I * ( 1.0 + S * cos( H - 240.0 / 180 * PI ) / cos( 300.0 / 180 * PI - H ) );
? R = 3.0 * I - ( G + B );
}
int R_value_in_rgb = R * 255;
int G_value_in_rgb = G * 255;
int B_value_in_rgb = B * 255;
BR = static_cast<BYTE>(R_value_in_rgb);
BG = static_cast<BYTE>(G_value_in_rgb);
BB = static_cast<BYTE>(B_value_in_rgb);
}

void? RGB2HSI(BYTE r,BYTE g,BYTE b,BYTE &h,BYTE &s,BYTE &i)
{
short m_fr = static_cast<short>(r);
short m_fg = static_cast<short>(g);
short m_fb = static_cast<short>(b);

float m_fiR = static_cast<float>(m_fr) / 255;
float m_fsG = static_cast<float>(m_fg) / 255;
float m_fhB = static_cast<float>(m_fb) / 255;
?
if( m_fr == m_fg && m_fg == m_fb)
{
? int iHValue = 0;
? int iSValue = 0;
? int iLValue = ((float)m_fr)/ 255 * 100;
? h = static_cast<BYTE>(iHValue);
? s = static_cast<BYTE>(iSValue);
? i = static_cast<BYTE>(iLValue);?
? return;
}
float max_value_of_rgb = GetMax( m_fiR, m_fsG, m_fhB );
float min_value_of_rgb = GetMin( m_fiR, m_fsG, m_fhB );
float fSumRGB =m_fiR + m_fsG + m_fhB ;
if( fSumRGB <= 0.0 )
? fSumRGB = 0.001;
float I = (m_fiR + m_fsG + m_fhB) / 3;
float S = 1.0 - 3.0 * min_value_of_rgb / fSumRGB;
float H = acos( (( m_fiR - m_fsG ) + ( m_fiR - m_fhB ))/2 / sqrt( ( m_fiR - m_fsG )*( m_fiR - m_fsG ) + ( m_fiR -m_fhB ) * ( m_fsG - m_fhB)? + 0.0001 ) );
float fHAngle = H / PI * 180;
if( m_fsG < m_fhB )
? fHAngle = 360 - fHAngle;
if( fHAngle > 360.0 )
? fHAngle = 360.0;
int nHValue = fHAngle / 360 * 255;
int nSValue = S * 100;
int nLValue = I * 100;
h = nHValue;
s = nSValue;
i = nLValue;
}

?

先來了解一些概念:

1.RGB是一種加色模型,就是將不同比例的Red/Green/Blue混合在一起得到新顏色.通常RGB顏色模型表示為:

2.HSB(HSV) 通過色相/飽和度/亮度三要素來表達顏色.

? H(Hue):表示顏色的類型(例如紅色,綠色或者黃色).取值范圍為0—360.其中每一個值代表一種顏色.

? S(Saturation):顏色的飽和度.從0到1.有時候也稱為純度.(0表示灰度圖,1表示純的顏色)

? B(Brightness or Value):顏色的明亮程度.從0到1.(0表示黑色,1表示特定飽和度的顏色)

?

后面地址是一個在線的觀察RGB到HSB轉換的工具:http://web.bentley.edu/empl/c/ncarter/MA307/color-converter.html

用RGB來表示顏色雖然方便,但是兩個相近的顏色的RGB值卻可能相差十萬八千里。用HSV(Hue色相、Saturation飽和度、Value(Brightness)明度,也叫HSB)來表示顏色就比較符合人們的習慣。

RGB到HSV(HSB)的轉換:


HSV(HSB)到RGB的轉換:


根據以上說明,有以下轉換公式(Java代碼)

[java] view plaincopy
  • public staticfloat[] rgb2hsb(int rgbR,int rgbG, int rgbB) {?
  • ??? assert 0 <= rgbR && rgbR <=255;?
  • ??? assert 0 <= rgbG && rgbG <=255;?
  • ??? assert 0 <= rgbB && rgbB <=255;?
  • ??? int[] rgb = newint[] { rgbR, rgbG, rgbB };?
  • ??? Arrays.sort(rgb);?
  • ??? int max = rgb[2];?
  • ??? int min = rgb[0];?
  • ?
  • ??? float hsbB = max / 255.0f;?
  • ??? float hsbS = max == 0 ? 0 : (max - min) / (float) max;?
  • ?
  • ??? float hsbH = 0;?
  • ??? if (max == rgbR && rgbG >= rgbB) {?
  • ??????? hsbH = (rgbG - rgbB) * 60f / (max - min) + 0;?
  • ??? } else if (max == rgbR && rgbG < rgbB) {?
  • ??????? hsbH = (rgbG - rgbB) * 60f / (max - min) + 360;?
  • ??? } else if (max == rgbG) {?
  • ??????? hsbH = (rgbB - rgbR) * 60f / (max - min) + 120;?
  • ??? } else if (max == rgbB) {?
  • ??????? hsbH = (rgbR - rgbG) * 60f / (max - min) + 240;?
  • ??? }?
  • ?
  • ??? return newfloat[] { hsbH, hsbS, hsbB };?
  • }?
  • ?
  • public staticint[] hsb2rgb(float h,float s, float v) {?
  • ??? assert Float.compare(h, 0.0f) >=0 && Float.compare(h, 360.0f) <=0;?
  • ??? assert Float.compare(s,0.0f) >= 0 && Float.compare(s,1.0f) <= 0;?
  • ??? assert Float.compare(v, 0.0f) >=0 && Float.compare(v, 1.0f) <=0;?
  • ?
  • ??? float r = 0, g =0, b = 0;?
  • ??? int i = (int) ((h /60) % 6);?
  • ??? float f = (h / 60) - i;?
  • ??? float p = v * (1 - s);?
  • ??? float q = v * (1 - f * s);?
  • ??? float t = v * (1 - (1 - f) * s);?
  • ??? switch (i) {?
  • ??? case 0:?
  • ??????? r = v;?
  • ??????? g = t;?
  • ??????? b = p;?
  • ??????? break;?
  • ??? case 1:?
  • ??????? r = q;?
  • ??????? g = v;?
  • ??????? b = p;?
  • ??????? break;?
  • ??? case 2:?
  • ??????? r = p;?
  • ??????? g = v;?
  • ??????? b = t;?
  • ??????? break;?
  • ??? case 3:?
  • ??????? r = p;?
  • ??????? g = q;?
  • ??????? b = v;?
  • ??????? break;?
  • ??? case 4:?
  • ??????? r = t;?
  • ??????? g = p;?
  • ??????? b = v;?
  • ??????? break;?
  • ??? case 5:?
  • ??????? r = v;?
  • ??????? g = p;?
  • ??????? b = q;?
  • ??????? break;?
  • ??? default:?
  • ??????? break;?
  • ??? }?
  • ??? return newint[] { (int) (r *255.0), (int) (g *255.0),?
  • ??????????? (int) (b * 255.0) };?
  • }?
  • ?

    ?

    ?

    幾種顏色模型的轉換公式

    XYZ —> RGB

    var_X = X / 100??????? //X from 0 to? 95.047????
    var_Y = Y / 100???????
    //Y from 0 to 100.000
    var_Z = Z / 100???????
    //Z from 0 to 108.883

    var_R = var_X *? 3.2406 + var_Y * -1.5372 + var_Z * -0.4986
    var_G = var_X * -0.9689 + var_Y *? 1.8758 + var_Z *? 0.0415
    var_B = var_X *? 0.0557 + var_Y * -0.2040 + var_Z *? 1.0570

    if ( var_R > 0.0031308 ) var_R = 1.055 * ( var_R ^ ( 1 / 2.4 ) ) - 0.055
    else???????????????????? var_R = 12.92 * var_R
    if ( var_G > 0.0031308 ) var_G = 1.055 * ( var_G ^ ( 1 / 2.4 ) ) - 0.055
    else???????????????????? var_G = 12.92 * var_G
    if ( var_B > 0.0031308 ) var_B = 1.055 * ( var_B ^ ( 1 / 2.4 ) ) - 0.055
    else???????????????????? var_B = 12.92 * var_B

    R = var_R * 255
    G = var_G * 255
    B = var_B * 255

    RGB —> XYZ

    var_R = ( R / 255 )??????? //R from 0 to 255
    var_G = ( G / 255 )??????? //G from 0 to 255
    var_B = ( B / 255 )??????? //B from 0 to 255

    if ( var_R > 0.04045 ) var_R = ( ( var_R + 0.055 ) / 1.055 ) ^ 2.4
    else?????????????????? var_R = var_R / 12.92
    if ( var_G > 0.04045 ) var_G = ( ( var_G + 0.055 ) / 1.055 ) ^ 2.4
    else?????????????????? var_G = var_G / 12.92
    if ( var_B > 0.04045 ) var_B = ( ( var_B + 0.055 ) / 1.055 ) ^ 2.4
    else?????????????????? var_B = var_B / 12.92

    var_R = var_R * 100
    var_G = var_G * 100
    var_B = var_B * 100

    X = var_R * 0.4124 + var_G * 0.3576 + var_B * 0.1805
    Y = var_R * 0.2126 + var_G * 0.7152 + var_B * 0.0722
    Z = var_R * 0.0193 + var_G * 0.1192 + var_B * 0.9505

    XYZ —> Yxy

    //X from 0 to 95.047??????

    //Y from 0 to 100.000
    //Z from 0 to 108.883

    Y = Y
    x = X / ( X + Y +Z )
    y = Y / ( X + Y +Z )

    Yxy —> XYZ

    //Y from 0 to 100
    //x from 0 to 1
    //y from 0 to 1


    X = x * ( Y / y )
    Y = Y
    Z = ( 1 - x - y ) * ( Y / y )

    XYZ —> Hunter-Lab

    (H)L = 10 * sqrt( Y )
    (H)a = 17.5 * ( ( ( 1.02 * X ) - Y ) / sqrt(Y ) )
    (H)b = 7 * ( ( Y - ( 0.847 * Z ) ) / sqrt(Y ) )

    Hunter-Lab —> XYZ

    var_Y = (H)L / 10
    var_X = (H)a / 17.5 * (H)L / 10
    var_Z = (H)b / 7 * (H)L / 10

    Y = var_Y ^ 2
    X = ( var_X + Y ) / 1.02
    Z = -( var_Z - Y ) / 0.847

    XYZ —> CIE-L*ab

    var_X = X / ref_X????????? //ref_X =? 95.047?

    var_Y = Y / ref_Y????????? //ref_Y = 100.000
    var_Z = Z / ref_Z????????? //ref_Z = 108.883

    if ( var_X > 0.008856 ) var_X = var_X ^ ( 1/3 )
    else??????????????????? var_X = ( 7.787 * var_X ) + ( 16 / 116 )
    if ( var_Y > 0.008856 ) var_Y = var_Y ^ ( 1/3 )
    else??????????????????? var_Y = ( 7.787 * var_Y ) + ( 16 / 116 )
    if ( var_Z > 0.008856 ) var_Z = var_Z ^ ( 1/3 )
    else??????????????????? var_Z = ( 7.787 * var_Z ) + ( 16 / 116 )

    CIE-L* = ( 116 * var_Y ) - 16
    CIE-a* = 500 * ( var_X - var_Y )
    CIE-b* = 200 * ( var_Y - var_Z )

    CIE-L*ab —> XYZ

    var_Y = ( CIE-L* + 16 ) / 116
    var_X = CIE-a* / 500 + var_Y
    var_Z = var_Y - CIE-b* / 200

    if ( var_Y^3 > 0.008856 ) var_Y = var_Y^3
    else????????????????????? var_Y = ( var_Y - 16 / 116 ) / 7.787
    if ( var_X^3 > 0.008856 ) var_X = var_X^3
    else????????????????????? var_X = ( var_X - 16 / 116 ) / 7.787
    if ( var_Z^3 > 0.008856 ) var_Z = var_Z^3
    else????????????????????? var_Z = ( var_Z - 16 / 116 ) / 7.787

    X = ref_X * var_X???? //ref_X =? 95.047????

    Y = ref_Y * var_Y???? //ref_Y = 100.000
    Z = ref_Z * var_Z???? //ref_Z = 108.883

    CIE-L*ab —> CIE-L*CH°

    var_H = arc_tangent( CIE-b*, CIE-a* )? //Quadrant by signs

    if ( var_H > 0 ) var_H = ( var_H / PI ) * 180
    else???????????? var_H = 360 - ( abs( var_H ) / PI ) * 180

    CIE-L* = CIE-L*
    CIE-C* = sqrt( CIE-a* ^ 2 + CIE-b* ^ 2 )
    CIE-H° = var_H

    CIE-L*CH° —>CIE-L*ab

    //CIE-H° from 0 to 360°

    CIE-L* = CIE-L*
    CIE-a* = cos( degree_2_radian( CIE-H° ) ) *CIE-C*
    CIE-b* = sin( degree_2_radian( CIE-H° ) ) *CIE-C*

    XYZ —> CIE-L*uv

    var_U = ( 4 * X ) / ( X + ( 15 * Y ) + ( 3 * Z ) )
    var_V = ( 9 * Y ) / ( X + ( 15 * Y ) + ( 3 *Z ) )

    var_Y = Y / 100
    if ( var_Y > 0.008856 ) var_Y = var_Y ^ ( 1/3 )
    else??????????????????? var_Y = ( 7.787 * var_Y ) + ( 16 / 116 )

    ref_X =? 95.047????
    ref_Y = 100.000
    ref_Z = 108.883

    ref_U = ( 4 * ref_X ) / ( ref_X + ( 15 * ref_Y ) + ( 3 * ref_Z ) )
    ref_V = ( 9 * ref_Y ) / ( ref_X + ( 15 * ref_Y ) + ( 3 * ref_Z ) )

    CIE-L* = ( 116 * var_Y ) - 16
    CIE-u* = 13 * CIE-L* * ( var_U - ref_U )
    CIE-v* = 13 * CIE-L* * ( var_V - ref_V )

    CIE-L*uv —> XYZ

    var_Y = ( CIE-L* + 16 ) / 116
    if ( var_Y^3 > 0.008856 ) var_Y = var_Y^3
    else????????????????????? var_Y = ( var_Y - 16 / 116 ) / 7.787

    ref_X =? 95.047???
    ref_Y = 100.000
    ref_Z = 108.883

    ref_U = ( 4 * ref_X ) / ( ref_X + ( 15 * ref_Y ) + ( 3 * ref_Z ) )
    ref_V = ( 9 * ref_Y ) / ( ref_X + ( 15 * ref_Y ) + ( 3 * ref_Z ) )

    var_U = CIE-u* / ( 13 * CIE-L* ) + ref_U
    var_V = CIE-v* / ( 13 * CIE-L* ) + ref_V

    Y = var_Y * 100
    X =? - ( 9 * Y * var_U ) / ( ( var_U - 4 ) * var_V? - var_U * var_V )
    Z = ( 9 * Y - ( 15 * var_V * Y ) - ( var_V * X ) ) / ( 3 * var_V )

    RGB —> HSL

    var_R = ( R / 255 )???????????????????? //RGB from 0 to 255
    var_G = ( G / 255 )
    var_B = ( B / 255 )

    var_Min = min( var_R, var_G, var_B )??? //Min. value of RGB
    var_Max = max( var_R, var_G, var_B )??? //Max. value of RGB
    del_Max = var_Max - var_Min???????????? //Delta RGB value

    L = ( var_Max + var_Min ) / 2

    if ( del_Max == 0 )???????????????????? //This is a gray, no chroma...
    {
    ?? H = 0??????????????????????????????? //HSL results from 0 to 1
    ?? S = 0
    }
    else??????????????????????????????????? //Chromatic data...
    {
    ?? if ( L < 0.5 ) S = del_Max / ( var_Max + var_Min )
    ?? else?????????? S = del_Max / ( 2 - var_Max - var_Min )

    ?? del_R = ( ( ( var_Max - var_R ) / 6 ) + ( del_Max / 2 ) ) / del_Max
    ?? del_G = ( ( ( var_Max - var_G ) / 6 ) + ( del_Max / 2 ) ) / del_Max
    ?? del_B = ( ( ( var_Max - var_B ) / 6 ) + ( del_Max / 2 ) ) / del_Max

    ?? if????? ( var_R == var_Max ) H = del_B - del_G
    ?? else if ( var_G == var_Max ) H = ( 1 / 3 ) + del_R - del_B
    ?? else if ( var_B == var_Max ) H = ( 2 / 3 ) + del_G - del_R

    ?? if ( H < 0 ) ; H += 1
    ?? if ( H > 1 ) ; H -= 1
    }

    HSL —> RGB

    if ( S == 0 )??????????????????????//HSL from 0 to 1
    {
    ?? R = L * 255?????????????????????
    //RGB results from 0 to 255
    ?? G = L * 255
    ?? B = L * 255
    }
    else
    {
    ?? if ( L < 0.5 ) var_2 = L * ( 1 + S )
    ?? else?????????? var_2 = ( L + S ) - ( S * L )

    ?? var_1 = 2 * L - var_2

    ?? R = 255 * Hue_2_RGB( var_1, var_2, H + ( 1 / 3 ) )
    ?? G = 255 * Hue_2_RGB( var_1, var_2, H )
    ?? B = 255 * Hue_2_RGB( var_1, var_2, H - ( 1 / 3 ) )
    }

    Hue_2_RGB( v1, v2, vH )???????????? //Function Hue_2_RGB
    {
    ?? if ( vH < 0 ) vH += 1
    ?? if ( vH > 1 ) vH -= 1
    ?? if ( ( 6 * vH ) < 1 ) return ( v1 + ( v2 - v1 ) * 6 * vH )
    ?? if ( ( 2 * vH ) < 1 ) return ( v2 )
    ?? if ( ( 3 * vH ) < 2 ) return ( v1 + ( v2 - v1 ) * ( ( 2 / 3 ) - vH ) * 6 )
    ?? return ( v1 )
    }

    RGB —> HSV

    var_R = ( R / 255 )???????????????????? //RGB from 0 to 255
    var_G = ( G / 255 )
    var_B = ( B / 255 )

    var_Min = min( var_R, var_G, var_B )??? //Min. value of RGB
    var_Max = max( var_R, var_G, var_B )??? //Max. value of RGB
    del_Max = var_Max - var_Min???????????? //Delta RGB value

    V = var_Max

    if ( del_Max == 0 )???????????????????? //This is a gray, no chroma...
    {
    ?? H = 0??????????????????????????????? //HSV results from 0 to 1
    ?? S = 0
    }
    else??????????????????????????????????? //Chromatic data...
    {
    ?? S = del_Max / var_Max

    ?? del_R = ( ( ( var_Max - var_R ) / 6 ) + ( del_Max / 2 ) ) / del_Max
    ?? del_G = ( ( ( var_Max - var_G ) / 6 ) + ( del_Max / 2 ) ) / del_Max
    ?? del_B = ( ( ( var_Max - var_B ) / 6 ) + ( del_Max / 2 ) ) / del_Max

    ?? if????? ( var_R == var_Max ) H = del_B - del_G
    ?? else if ( var_G == var_Max ) H = ( 1 / 3 ) + del_R - del_B
    ?? else if ( var_B == var_Max ) H = ( 2 / 3 ) + del_G - del_R

    ?? if ( H < 0 ) ; H += 1
    ?? if ( H > 1 ) ; H -= 1
    }

    HSV —> RGB

    if ( S == 0 )?????????????????????? //HSV from 0 to 1
    {
    ?? R = V * 255
    ?? G = V * 255
    ?? B = V * 255
    }
    else
    {
    ?? var_h = H * 6
    ?? if ( var_h == 6 ) var_h = 0????? //H must be < 1
    ?? var_i = int( var_h )???????????? //Or ... var_i = floor( var_h )
    ?? var_1 = V * ( 1 - S )
    ?? var_2 = V * ( 1 - S * ( var_h - var_i ) )
    ?? var_3 = V * ( 1 - S * ( 1 - ( var_h - var_i ) ) )

    ?? if????? ( var_i == 0 ) { var_r = V???? ; var_g = var_3 ; var_b = var_1 }
    ?? else if ( var_i == 1 ) { var_r = var_2 ; var_g = V???? ; var_b = var_1 }
    ?? else if ( var_i == 2 ) { var_r = var_1 ; var_g = V???? ; var_b = var_3 }
    ?? else if ( var_i == 3 ) { var_r = var_1 ; var_g = var_2 ; var_b = V???}
    ?? else if ( var_i == 4 ) { var_r = var_3 ; var_g = var_1 ; var_b = V???}
    ?? else?????????????????? { var_r = V???? ; var_g = var_1 ; var_b = var_2 }

    ?? R = var_r * 255????????????????? //RGB results from 0 to 255
    ?? G = var_g * 255
    ?? B = var_b * 255
    }

    RGB —> CMY

    //RGB values from 0 to 255
    //CMY results from 0 to 1

    C = 1 - ( R / 255 )
    M = 1 - ( G / 255 )
    Y = 1 - ( B / 255 )

    CMY —> RGB

    //CMY values from 0 to 1
    //RGB results from 0 to 255


    R = ( 1 - C ) * 255
    G = ( 1 - M ) * 255
    B = ( 1 - Y ) * 255

    CMY —> CMYK

    //CMYK and CMY values from 0 to 1

    var_K = 1

    if ( C < var_K )?? var_K = C
    if ( M < var_K )?? var_K = M
    if ( Y < var_K )?? var_K = Y
    if ( var_K == 1 ) { //Black
    ?? C = 0
    ?? M = 0
    ?? Y = 0
    }
    else {
    ?? C
    = ( C - var_K ) / ( 1 - var_K )
    ?? M = ( M - var_K ) / ( 1 - var_K )
    ?? Y = ( Y - var_K ) / ( 1 - var_K )
    }
    K = var_K

    CMYK —> CMY

    //CMYK and CMY values from 0 to 1

    C = ( C * ( 1 - K ) +K )
    M = ( M * ( 1 - K ) + K )
    Y = ( Y * ( 1 - K ) + K )

    總結

    以上是生活随笔為你收集整理的几种颜色模型的转换公式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。