線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1510
推到 Plurk!
推到 Facebook!

請問顏色的亮度(light)問題

尚未結案
iamjsn
初階會員


發表:78
回覆:95
積分:44
註冊:2002-08-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-01-17 22:24:53 IP:203.204.xxx.xxx 未訂閱
系統選取顏色的對話盒中, 選取某個顏色,會出現這個顏色的亮度值 如選了紅色,亮度值是120, 在對話盒最右邊就會出現這個"紅色" 亮度值由0~255的色階表。 請問對於任一色的這種亮度由0~255的色階表是怎麼做出來的呢 某個色的亮度值與這個顏色之間有一定的換算公式嗎? 因為元件需要做某色的亮度色階圖,但不知其中的換算規則,不知有沒有大大知道的能指點一下,謝謝。
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-01-18 01:06:43 IP:61.62.xxx.xxx 未訂閱
請參考:    http://www.cvl.iis.u-tokyo.ac.jp/~miyazaki/program/tech01.html    其中的 RGB<-->HLS 的轉換. 注意, 其中的 H 就是對話盒中的色調, S 就是濃度, L 就是亮度!! (但他值域是 0~360, 0~1, 0~1, 和對話盒中的值域不同哦~)    在 windows 顏色選擇對話盒中的 HSL 是從 0~240, RGB 是由 0~255, 簡單寫個由 RGB -> HSL 對話盒的參數對應值:    
procedure TForm1.Button2Click(Sender: TObject);
var
  R, G, B: Double;
  H, S, L: Double;
  mx, mn, cd: Double;
begin
  R:=32; G:=17; B:=85;
  R:=R/255; G:=G/255; B:=B/255;
  mx := MaxValue([R, G, B]);
  mn := MinValue([R, G, B]);
  cd := mx - mn;
  L := ( mx + mn ) / 2;
  if(cd=0) then
  begin
    H := 0;
    S := 0;
  end
  else
  begin
    if(L<=0.5) then S:=cd/(mx+mn)
    else S:=cd/(2-(mx+mn));
    if(R=mx) then H:=(G-B)/cd
    else if(G=mx) then H:=2+(B-R)/cd
    else if(B=mx) then H:=4+(R-G)/cd;
  end;
  // if cd = 0 , it means the h may be any of 0~360!!
  // but windows api color dialog always put the position to 240!      // to convert HSL to 0~240 value domain
  L:=L*240;
  S:=S*240;
  H:=H*60;
  if(H<0) then H:=H+360;
  H:=H/360*240;
  ShowMessage(FORMAT('%f, %f, %f',[H, S, L]));
end;
iamjsn
初階會員


發表:78
回覆:95
積分:44
註冊:2002-08-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-01-18 19:44:00 IP:203.204.xxx.xxx 未訂閱
謝謝,那再請問一下最右邊那條紫色漸層要怎麼畫出來呢 因為通常我們會在左邊色盤中隨便點一色右邊就會出現那一色的亮度漸層色 有大大會畫嗎,謝
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-01-19 23:17:59 IP:61.62.xxx.xxx 未訂閱
HI, 請參考這篇, 弟寫了一個小範例!!    http://delphi.ktop.com.tw/topic.php?TOPIC_ID=43797    另外上面所附的參考資料中(http://www.cvl.iis.u-tokyo.ac.jp/~miyazaki/program/tech01.html)的 RGB<-->HLS 轉換公式有一行有誤, 弟還為此找了一些其他的資料驗證, 原內容為:    L<=0.5: cmin=L*(1-S), cmax=2*L-cmin L>0.5: cmax=L*(1-S)+S, cmin=2*L-cmax R=f(H+120) G=f(H) B=f(H-120)    f(h)= h<60: cmin+(cmax-cmin)*h/60 h>=60 && h<180: cmax h>=180 && h<240: cmin+(cmax-cmin)*(240-h)/60 h>=240: cmin 應該為: L<=0.5: cmin=L*(1S), cmax=2*L-cmin L>0.5: cmax=L*(1-S)+S, cmin=2*L-cmax R=f(H+120) G=f(H) B=f(H-120) f(h)= h<60: cmin+(cmax-cmin)*h/60 h>=60 && h<180: cmax h>=180 && h<240: cmin+(cmax-cmin)*(240-h)/60 h>=240: cmin 請特別注意一下哦~~
iamjsn
初階會員


發表:78
回覆:95
積分:44
註冊:2002-08-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-01-24 17:28:35 IP:203.204.xxx.xxx 未訂閱
你好讚喔,剛從老家過年回來,想不到回來就蒙大大解決了這個問題,真是太謝謝了。
系統時間:2024-06-29 8:35:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!