簡單的二色漸層(漸變色)的算法 |
|
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
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 發送簡訊給我 |
謝謝版主給分,嘻
我剛剛用這個例子做了個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 發送簡訊給我 |
|
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
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 發送簡訊給我 |
|
longsorry
一般會員 發表:0 回覆:4 積分:0 註冊:2003-10-22 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |