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

簡單的二色漸層(漸變色)的算法

 
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-16 14:37:05 IP:211.96.xxx.xxx 未訂閱
const AC = clRED;        //假設我要畫一個框,從左邊紅色到右邊黃色
      BC = clYellow;
var x : integer; 
    NR,NG,NB : word;              // 新的RGB值
    RStep,GStep,BStep : smallint; // RGB三原色差(-255 ~ 255)
    xdegree: double;              // 漸變比值
    xrect : TRect ;               // 我要畫的矩形區塊  
begin
   xrect:=rect(100,100,800,200);  
   with form1.Canvas do begin     // 直接在FORM1的CANVAS上作圖
      RStep:=((bC and $0000FF)-(ac and $0000FF));    // 求出AC跟BC之間的紅色差
      GStep:=((bC and $00FF00)shr 8 )-((ac and $00FF00)shr 8 );  // 綠色差
      BStep:=((bC and $FF0000)shr 16)-((ac and $FF0000)shr 16);  // 藍色差          for x:= xrect.Left to xrect.Right do begin //從左到右一條條畫垂直線
         xdegree:=(x-xrect.Left)/(xrect.Right-xrect.Left); //算出現在是要畫到多少比值
         NR:=(ac and $0000FF)        +round(RStep*xdegree);//AC紅色的部份加上紅色差*比值  
         NG:=((ac and $00FF00)shr 8 )+round(GStep*xdegree);//同上,綠色
         NB:=((ac and $FF0000)shr 16)+round(BStep*xdegree);//同上,藍色
         pen.Color:=NR or(NG shl 8)or(NB shl 16);//把RGB三個BYTE合起來就是RGB值,設在PEN.COLOR里
         polyline([point(x,xrect.top),point(x,xrect.bottom)]);  //畫垂直線
      end;
   end;
程式的寫法不是重點,重點是在漸層色的算法而已.......... 我不懂,不懂,不懂....所以我才來ktop學工夫 發表人 - japhenchen 於 2003/10/16 14:50:35
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-16 16:19:42 IP:211.96.xxx.xxx 未訂閱
謝謝版主給分,嘻 我剛剛用這個例子做了個RGB模型出來,程式一樣很簡單,用一堆FOR就變出來了
var colorarray : array[0..6] of TColor;
    AC, BC ,BaseC : TColor;
    x,xsec,y,BLEN,B1,B2: integer;
    xrect : TRect ;
    ccnt : integer;
    xlev, ylev : double;
  function cdegree(AColor,BColor:TColor;level:double):TColor;
  var RStep,GStep,BStep:smallint; // RGB三原色差
      NR,NG,NB : word;
  begin
     RStep:=((bcolor and $0000FF)-(acolor and $0000FF));
     GStep:=((bcolor and $00FF00)shr 8 )-((acolor and $00FF00)shr 8 );
     BStep:=((bcolor and $FF0000)shr 16)-((acolor and $FF0000)shr 16);
     NR:=(acolor and $0000FF)        + round(RStep*level);
     NG:=((acolor and $00FF00)shr 8 )+ round(GStep*level);
     NB:=((acolor and $FF0000)shr 16)+ round(BStep*level);
     result:=NR or(NG shl 8)or(NB shl 16);
  end;
begin
   colorarray[0]:=clRed;
   colorarray[1]:=clYellow;
   colorarray[2]:=clLime;
   colorarray[3]:=clBlue;
   colorarray[4]:=clNavy;
   colorarray[5]:=$FF00FF;
   colorarray[6]:=clRED;         // 從左至右依序 紅 黃 綠 藍 靛 紅
   BaseC:=$B4B4B4;               // 最底下的灰色~~~~       ccnt:=length(colorarray);
   xrect:=rect(100,100,800,500);
   BLEN:=(xrect.Right-xrect.Left)div ccnt;       with form1.Canvas do
      for y:=xrect.Top to xrect.Bottom do begin
         ylev := (y-xrect.Top)/(xrect.Bottom-xrect.Top);
         for xsec := 1 TO (CCNT-1) DO BEGIN
            B1 := (xsec-1)*BLEN;
            B2 := B1 + BLEN - 1;
            for x:= B1 TO B2 do begin
               xlev:=(x-b1)/(b2-b1);
               AC:=cdegree(colorarray[xsec-1],BaseC,ylev);
               BC:=cdegree(colorarray[xsec],baseC,ylev);
               pixels[xrect.left+x,y]:=cdegree(ac,bc,xlev);
            end;
         END;
      end;
end;
我不懂,不懂,不懂....所以我才來ktop學工夫 發表人 - japhenchen 於 2003/10/16 16:33:58
longsorry
一般會員


發表:0
回覆:4
積分:0
註冊:2003-10-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-22 09:30:26 IP:211.74.xxx.xxx 未訂閱
大家好~~ 請問一下,這張256色漸層的圖,如果要用滑鼠點下去,並取出此點的RGB值應該怎麼寫呢?? 高手請回應!!謝謝!
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-22 11:48:23 IP:211.96.xxx.xxx 未訂閱
procedure TFORM1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var picolor : TColor;
begin
   picolor:=Form1.canvas.pixels[x,y];
   // picolor這就是你要的點的RGB值囉
end;
建議如果要做色表讓使用者選色,最好用TIMAGE元件,不然畫在FORM上(是我偷懶才直接在FORM上作怪),小心前景出現了另一個WINDOW,這圖會被破壞唷! IMAGE挑色的用法跟上面寫的一樣啦!只是主對象不同...一樣對CANVAS處理即可 我不懂,不懂,不懂....所以我才來ktop學工夫
japhenchen
高階會員


發表:51
回覆:444
積分:184
註冊:2003-07-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-22 12:02:20 IP:211.96.xxx.xxx 未訂閱
還有啊,這RGB MODAL,不是256色而已唷!是256的3次方,1677萬色唷! 我不懂,不懂,不懂....所以我才來ktop學工夫
longsorry
一般會員


發表:0
回覆:4
積分:0
註冊:2003-10-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-23 09:15:45 IP:211.74.xxx.xxx 未訂閱
謝謝你的回應,我會再試試看的
系統時間:2024-04-30 1:21:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!