大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> delphi中一个画渐变的方法

delphi中一个画渐变的方法

时间: 2021-07-31 作者:daque

(*———————————————道理:————————————————对于任何一种线性突变(即是最罕见的那种),在由开始和尽头设置的突变区内,像素的rgb重量对于x和y坐目标偏导数都是恒量。所以咱们不妨先用极小的价格来计划出这个二元方程的初始值,而后运用累加递推的本领计划出一切的值。———————————————注 1:————————————————突变区:由辨别过程开始和尽头,并笔直于这零点连线的平行曲线和画图地区 的边境围成的地区。在这个地区除外的像素不复有突变。———————————————注 2:————————————————为了简化编制程序,我运用了浮点数来举行累加计划。本质上不妨先用移位操纵来“夸大”脸色值以普及累加时的精度,写入位图时再用移位“减少”来回复本质的值。———————————————尝试:————————————————该本领在delphi6下调节和测试经过。在duron800,1152 x 864下采用重回1000次取平衡值的本领尝试。100 x 100:平衡为4ms;500 x 200:平衡为18ms;(我同声还在听mp3:p)*)function ssdrawgradient(acanvas: tcanvas; acliprect: trect;frompoint, topoint: tpoint; fromcolor, tocolor: tcolor): boolean;typetssgradientdirection=(gdeast, gdwest, gdnorth, gdsouth, gdother);varbuf:tbitmap;w,h,y,x,xoffset,ir,ig,ib,pw,ph:integer;c1, c2: tcolor;r1,g1,b1,r2,g2,b2,br,bg,bb,rmax,rmin,gmax,gmin,bmax,bmin: byte;kx,ky,kx0,ky0,rx0,gx0,bx0,r0,g0,b0,drx,dry,dgx,dgy,dbx,dby,dr,dg,db: double;p : pbytearray;function getstep(v1, v2, v3:integer): double;beginif v2=v1 then result:=0else result:=v3/(v2-v1);end;beginresult:=false;if (frompoint.y=topoint.y)and(frompoint.x=topoint.x) then exit;buf:=tbitmap.create;try//初始化缓冲区buf.pixelformat:=pf24bit;w:=widthofrect(acliprect);buf.width:=w;h:=heightofrect(acliprect);buf.height:=h;//为了提防演算溢出而设的查看if (w>screen.width)or(h>screen.height) then exit;//读取突变开始和尽头的rgb值c1:=colortorgb(fromcolor);c2:=colortorgb(tocolor);r1:=getrvalue(c1);g1:=getgvalue(c1);b1:=getbvalue(c1);r2:=getrvalue(c2);g2:=getgvalue(c2);b2:=getbvalue(c2);if r1>r2 then begin rmin:=r2; rmax:=r1 endelse begin rmin:=r1; rmax:=r2 end;if g1>g2 then begin gmin:=g2; gmax:=g1 endelse begin gmin:=g1; gmax:=g2 end;if b1>b2 then begin bmin:=b2; bmax:=b1 endelse begin bmin:=b1; bmax:=b2 end;pw:=abs(topoint.x-frompoint.x);ph:=abs(topoint.y-frompoint.y);kx:=pw/sqrt(ph*ph+pw*pw);ky:=ph/sqrt(ph*ph+pw*pw);//计划出rgb值对立于xy轴的线性变革系数drx:=getstep(acliprect.left, acliprect.right, round((r2-r1)*kx));dry:=getstep(acliprect.top, acliprect.bottom, round((r2-r1)*ky));dgx:=getstep(acliprect.left, acliprect.right, round((g2-g1)*kx));dgy:=getstep(acliprect.top, acliprect.bottom, round((g2-g1)*ky));dbx:=getstep(acliprect.left, acliprect.right, round((b2-b1)*kx));dby:=getstep(acliprect.top, acliprect.bottom, round((b2-b1)*ky));//计划出矩形左上角的rgb值,备用kx0:=getstep(frompoint.x, topoint.x, frompoint.x);ky0:=getstep(frompoint.y, topoint.y, frompoint.y);r0:=r1+(kx0+ky0)*r2;g0:=g1+(kx0+ky0)*g2;b0:=b1+(kx0+ky0)*b2;//这三个变量是每个扫描线的第一个点的rgb值rx0:=r0;gx0:=g0;bx0:=b0;for y:=0 to h-1 dobeginxoffset:=0;//dr道理是double典型的赤色值,其余类比dr:=rx0;dg:=gx0;db:=bx0;p := buf.scanline[y];for x:=0 to w-1 dobegin//ir的道理是整型的赤色值,其余类比//之以是要先转成整型,是由于我感触整型的比拟大概会比浮点快一点//归正都要三次round的,不如早做……ir:=round(dr);ig:=round(dg);ib:=round(db);//br的道理是字节型的赤色值br:=max(min(rmax,ir),rmin);bg:=max(min(gmax,ig),gmin);bb:=max(min(bmax,ib),bmin);//依照偏移量树立rgb值p[xoffset]:=bb;p[xoffset+1]:=bg;p[xoffset+2]:=br;if frompoint.x<>topoint.x thenbegin//下一个像素的rgb值辨别依照确定的系数递加dr:=dr+drx;dg:=dg+dgx;db:=db+dbx;end;//由于我设置的p是字节型的数组,以是这边递加“3”,制止运用乘法inc(xoffset, 3);end;if frompoint.y<>topoint.y thenbegin//依照rgb在y轴方进取的变革顺序计划下一条龙的第一个像素rgb值rx0:=rx0+dry;gx0:=gx0+dgy;bx0:=bx0+dby;end;end;//将缓冲区复制到目的上bitblt(acanvas.handle, acliprect.left, acliprect.top, w, h,buf.canvas.handle, 0, 0, srccopy);result:=true;finallybuf.free;end;end; 

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.