RGB和HSL之間的轉換 C 實現

2022-03-25 00:57:51 字數 1561 閱讀 2251

#define min3v(v1, v2, v3)   ((v1)>(v2)? ((v2)>(v3)?(v3):(v2)):((v1)>(v3)?(v3):(v2)))

#define max3v(v1, v2, v3)   ((v1)<(v2)? ((v2)<(v3)?(v3):(v2)):((v1)<(v3)?(v3):(v1)))

typedef struct

color_rgb;

typedef struct

color_hsl;

// converts rgb to hsl

static void rgbtohsl(const color_rgb *rgb, color_hsl *hsl)

else if(maxval==r && g>=b)

else if(maxval==r && g// luminance

l = (maxval+minval)/2.0f;

// saturation

if(l == 0 || maxval == minval)

else if(00.5f)

hsl->hue = (h>360)? 360 : ((h<0)?0:h);

hsl->saturation = ((s>1)? 1 : ((s<0)?0:s))*100;

hsl->luminance = ((l>1)? 1 : ((l<0)?0:l))*100;

}// converts hsl to rgb

static void hsltorgb(const color_hsl *hsl, color_rgb *rgb)

else

else if((t[i]*2.0f) < 1) //(1.0/6.0)<=t[i] && t[i]<0.5

else if((t[i]*3.0f) < 2) // 0.5<=t[i] && t[i]<(2.0/3.0)

else t[i] = p;

}r = t[0]*255.0f;

g = t[1]*255.0f;

b = t[2]*255.0f;

}rgb->red = (int)((r>255)? 255 : ((r<0)?0 : r));

rgb->green = (int)((g>255)? 255 : ((g<0)?0 : g));

rgb->blue = (int)((b>255)? 255 : ((b<0)?0 : b));

}// 在windows系統下,hsl分量的範圍是[0,240].參考「畫筆」程式,可以看到rgb(紅|綠|藍)

// 和hsl(色調|飽和度|亮度)的聯絡。

// 下面的**,把color_hsl的分量值變為windows的hsl分量,取值在[0,240]之間,需要:

// 下面為color_hsl到windows的hsl的轉換:

// win_h = 240 * hsl.hue / 360.f;

// win_s = 240 * hsl.saturation / 100.f;

// win_l = 240 * hsl.luminance / 100.f;

上面內容**自原文裡有些錯誤,已修正~

RGB 和 HSL 的轉換和應用

一丶hsl hsl即色相 飽和度 亮度 英語 hue,saturation,lightness 色相 h 是色彩的基本屬性,就是平常所說的顏色名稱,如紅色 黃色等,取0 360。飽和度 s 是指色彩的純度,越高色彩越純,低則逐漸變灰,取0 100 0 1 的數值。明度 v 亮度 l 取0 100 0...

RGB565和RGB888的轉換

1 rgb565或rgb16格式說明 rgb565彩色模式也稱rgb16彩色模式,指的是用16位表示乙個畫素,即 乙個畫素佔兩個位元組,其中 第乙個位元組的前5位用來表示r red 第乙個位元組的後三位 第二個位元組的前三位用來表示g green 第二個位元組的後5位用來表示b blue 如 15 ...

RGB和YUV的區別和轉換

rgb和yuv都是色彩空間,用於表示顏色,兩者可以相互轉化 至於電視採用yuv分量形式是由itu 國際電信聯盟 規定的,因為其能減少資料儲存空間和資料傳輸頻寬,同時又能非常方便的相容黑白電視!yuv是被歐洲電視系統所採用的一種顏色編碼方法 屬於pal 是pal和secam模擬彩色電視制式採用的顏色空...