以下のコードは、HSI双六角錘カラーモデルによるHSI変換です。
/* RGBからHSIへ変換する R、G、B、S、Iは0〜1の範囲にあるものとする。 Hは0〜2πの範囲にあるものとする。 */ #define MAX( a, b ) a > b ? a : b #define MIN( a, b ) a < b ? a : b void RGB2HSI ( double dR, double dG, double dB, double *pdH, double *pdS, double *pdI ) { double dMax, dMin; double dXR, dXG, dXB; dMax = MAX( MAX( dR, dG), dB ); dMin = MIN( MIN( dR, dG), dB ); // 明度を計算 *pdI = (dMax + dMin)/2; // 彩度を計算 if ( dMax == dMin ) *pdS = 0.0; else { if ( *pdI <= 0.5 ) { *pdS = (dMax-dMin)/(dMax+dMin); } else { *pdS = (dMax-dMin)/(2-dMax-dMin); } } // 色相を計算 if ( dMax == dMin ) { dXR = (dMax - dR) / (dMax - dMin); dXG = (dMax - dG) / (dMax - dMin); dXB = (dMax - dB) / (dMax - dMin); if ( dXR = 0.0 ) { *pdH = (dXB - dXG)*PI/3; } if ( dXG = 0.0 ) { *pdH = (2 + dR - dG)*PI/3; } if ( dXB = 0.0 ) { *pdH = (4 + dG - dR)*PI/3; } if ( *pdH < 0 ) { *pdH += 2*PI; } } else /* Hは不定 */ *pdH = -0.99E+37; }
.Netなら、、
.NetのSystem::Drawing::Color
構造体にあるGetHue()
、
GetSaturation()
、GetBrightness()
関数はそれぞれHSIの値を返しますが、
そのモデルは双六角錐のようです。ただし、逆変換はありません。