在线等待“在圆形或椭圆区域内使填充颜色渐变”??高分相赠!!!!
在线等待“在圆形或椭圆区域内使填充颜色渐变”??高分相赠!!!!
我已经做过一个,是将Brush.Bitmap设置成我用程序实现的颜色渐变,然后用strechdraw();可以画出一个正方形或长方形的来。但是对于圆形或椭圆就不能实现。
用以下方法:
canvas.Brush.Bitmap:=图形文件;
canvas.ellipse();
以上实现的效果有这样情况,如果ellipse的初始点坐标是图形文件宽度和高度整数倍时则在椭圆或圆区域内显示完全图象,如果不是初始坐标,而且ellipse使用的宽度和高度跟图形相同的时候,则在椭圆或圆区域内显示多个半图(图形文件左一半,有一半).
请大家帮我解决在椭圆或圆区域内显示出渐变色,不一定是用canvas.Brush.Bitmap:=图形文件.
问题点数:100、回复次数:30Top
1 楼huojiehai(海天子)回复于 2003-08-03 10:55:02 得分 1
我不会,但帮你顶!Top
2 楼failer(独败)回复于 2003-08-03 10:57:53 得分 1
关注Top
3 楼ingener(祝福)回复于 2003-08-03 11:07:52 得分 0
大家帮我顶,来着有分!Top
4 楼bxh2dai(希望明天会有些改变)回复于 2003-08-04 21:53:18 得分 1
好的,我也来顶,但是这个问题,我以前见过,我帮你去找找看,看能不能帮你解决Top
5 楼ingener(祝福)回复于 2003-08-05 09:49:18 得分 0
大家快来顶。来着有分!Top
6 楼zth215(大海)回复于 2003-08-05 10:02:14 得分 1
关注,学习Top
7 楼tonylk(=www.tonixsoft.com=)回复于 2003-08-05 10:19:00 得分 0
有一个稍麻烦点的方法,
先制作一个矩形的,足够包容该椭圆的颜色渐变的图像,
然后制作两个椭圆图像,一个是白底黑色图形的,另一个是黑底白色图形的,
将黑底白色图形的图像和你的窗口底色做按位与操作,这样背景色的中间椭圆型区域为黑色了,接着讲白底黑色图形的图像与刚才制作的彩色渐变图像做按位与操作,该渐变图像变为底色为黑色,
最后将以上处理过的背景图像和渐变色图像做按位或操作。完成。
不知道说明白了没有。。Top
8 楼ingener(祝福)回复于 2003-08-05 10:37:47 得分 0
这个方法我试试吧,不过2次与之后之后在按位或,不知道变成什么颜色了。
你有原码吗?贴一下,小弟表示感谢。
谁还有更简单的方法。帮忙顶。Top
9 楼tonylk(=www.tonixsoft.com=)回复于 2003-08-05 11:27:43 得分 0
好像有CopyRect函数,设置最后一个参数为SRC_OR,SRC_AND,等,这种方法我以前做过,肯定没有问题,晚上回家帮你找一下代码吧。Top
10 楼ingener(祝福)回复于 2003-08-05 16:22:01 得分 0
好,继续顶Top
11 楼Borland2004(我是转型者)回复于 2003-08-05 16:47:06 得分 0
我相信我可以给你写出来,但是我需要交换,你帮我写一个ADO存取图标的Demo,我帮你写这个的DemoTop
12 楼ingener(祝福)回复于 2003-08-05 16:57:18 得分 0
ADO存取图标的这个不难,你是存储.bmp,还是.ico的??Top
13 楼tonylk(=www.tonixsoft.com=)回复于 2003-08-05 19:30:52 得分 50
Canvas.CopyMode:=cmSrcAnd;
Canvas.CopyRect(RectTmpDes,TuTmp^.AMaskBmp.Canvas,RectTmpSrc);
Canvas.CopyMode:=cmSrcPaint;
Canvas.CopyRect(RectTmpDes,TuTmp^.ABmp.Canvas,RectTmpSrc);
Top
14 楼Borland2004(我是转型者)回复于 2003-08-05 20:31:27 得分 1
我只需要存储ICO就可以了,你帮我写Demo,我给你写DemoTop
15 楼lovedata(萨菲洛斯&我爱娃娃)回复于 2003-08-05 23:37:02 得分 20
这是我帮你找的关于图象的梯度填充的资料,但是代码不全,你自己看看吧~
Gradient fill procedure
Undertitle:
Category: Graphic
Uploader: Gerhardus Geldenhuis
Question: Gradient fill
Answer: paste this on your form + 1 button and 2 panels and a paintbox and link the panels onclick event and you will see it work
it is fairly fast.
when using this code in your application it is suggested to first draw to a tbitmap this will when the screen area neads to be redrawn speed it up considerably.
function getnewcolor(M1,M2:TColor;Location:Integer):TColor;
var
V : array[0..2] of Byte;//BeginRGBValue
D : array[0..2] of integer;//RGBDifference
R,G,B : Byte;
K1,K2 :Longint;
begin
K1:=ColorToRGB(M1);
K2:=ColorToRGB(M2);
V[0] := GetRValue(K1);
V[1] := GetGValue(K1);
V[2] := GetBValue(K1);
D[0] := GetRValue(K2)-V[0];
D[1] := GetGValue(K2)-V[1];
D[2] := GetBValue(K2)-V[2];
R := V[0] + MulDiv (Location, D[0], Form1.PaintBox1.Width - 1);
G := V[1] + MulDiv (Location, D[1], Form1.PaintBox1.Width - 1);
B := V[2] + MulDiv (Location, D[2], Form1.PaintBox1.Width - 1);
Result:=RGB(R, G, B);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
I :Integer;
begin
for i:=1 to PaintBox1.Width do
begin
PaintBox1.Canvas.Pen.Color:=GetNewColor(panel1.color,panel2.color,i);
PaintBox1.Canvas.MoveTo(i,1);
PaintBox1.Canvas.LineTo(i,Panel2.Height);
end;
end;
procedure TForm1.Panel1Click(Sender: TObject);
begin
if ColorDialog1.Execute then
if Sender=Panel1 then
Panel1.Color:=ColorDialog1.Color
else
Top
16 楼lovedata(萨菲洛斯&我爱娃娃)回复于 2003-08-05 23:37:40 得分 0
我觉得这个方法是可以的,好好研究研究吧~Top
17 楼ingener(祝福)回复于 2003-08-06 08:58:25 得分 0
你这个方法我试过,不过只能完成长方形或正方形的颜色渐变,对于圆或椭圆没有办法填充的。欢迎朋友继续。来着有分。Top
18 楼ingener(祝福)回复于 2003-08-06 10:14:00 得分 0
怎么没有人顶呀,没有人来我自己顶Top
19 楼hiflower(花)回复于 2003-08-06 12:46:28 得分 22
这是我编的一个函数,可以有一个 Rect 中进行颜色渐变。有水平渐变、垂直渐变、矩形渐变、椭圆渐变
你只要将这个 Rect 再进行圆形或椭圆剪裁就能达到目的了。
type TArtRectMode=(armHorizontal,armVertical,armRectangle,armEllipse);
procedure DrawArtRect(ACanvas:TCanvas;ARect:TRect;ColorFrom,ColorTo:TColor;
ArtRectMode:TArtRectMode;Supplement:Integer=100);
var
Bmp:TBitmap;
i,n:Integer;
r1,g1,b1,r2,g2,b2:Integer;
r,g,b:Integer;
dr,dg,db,nr,ng,nb:Extended;
YXScale,f:Double;
OldColor:TColor;
begin
OldColor:=-1;
Bmp:=TBitmap.Create;
with Bmp do
begin
Width:=ARect.Right-ARect.Left;
Height:=ARect.Bottom-ARect.Top;
Canvas.Pen.Color:=clWhite;
Canvas.Brush.Color:=clWhite;
Canvas.Rectangle(0,0,Width,Height);
end;
r1:=GetRValue(ColorFrom);
g1:=GetGValue(ColorFrom);
b1:=GetBValue(ColorFrom);
r2:=GetRValue(ColorTo);
g2:=GetGValue(ColorTo);
b2:=GetBValue(ColorTo);
case ArtRectMode of
armHorizontal:
begin
dr:=(r2-r1)/Bmp.Width;
dg:=(g2-g1)/Bmp.Width;
db:=(b2-b1)/Bmp.Width;
nr:=r1;
ng:=g1;
nb:=b1;
with Bmp.Canvas do
begin
for i:=0 to Bmp.Width do
begin
r:=Trunc(nr);
g:=Trunc(ng);
b:=Trunc(nb);
// r:=Trunc(r1+(r2-r1)/Bmp.Width*i);
// g:=Trunc(g1+(g2-g1)/Bmp.Width*i);
// b:=Trunc(b1+(b2-b1)/Bmp.Width*i);
Pen.Color:=RGB(r,g,b);
MoveTo(i,0);
LineTo(i,Bmp.Height);
nr:=nr+dr;
ng:=ng+dg;
nb:=nb+db;
end;
end;
end;
armVertical:
begin
dr:=(r2-r1)/Bmp.Height;
dg:=(g2-g1)/Bmp.Height;
db:=(b2-b1)/Bmp.Height;
nr:=r1;
ng:=g1;
nb:=b1;
with Bmp.Canvas do
begin
for i:=0 to Bmp.Height do
begin
r:=Trunc(nr);
g:=Trunc(ng);
b:=Trunc(nb);
Pen.Color:=RGB(r,g,b);
MoveTo(0,i);
LineTo(Bmp.Width,i);
nr:=nr+dr;
ng:=ng+dg;
nb:=nb+db;
end;
end;
end;
armRectangle:
begin
YXScale:=Abs(Supplement/100);
n:=Trunc(Max(Bmp.Height/YXScale,Bmp.Width)/2);
dr:=(r2-r1)/n;
dg:=(g2-g1)/n;
db:=(b2-b1)/n;
nr:=r1;
ng:=g1;
nb:=b1;
with Bmp.Canvas do
begin
Brush.Style:=bsSolid;
Pen.Mode:=pmCopy;
Pen.Style:=psSolid;
for i:=n downto 0 do
begin
r:=Trunc(nr);
g:=Trunc(ng);
b:=Trunc(nb);
Pen.Color:=RGB(r,g,b);
// Brush.Color:=Pen.Color;
Brush.Style:=bsClear;
Rectangle(Bmp.Width div 2 -i,Bmp.Height div 2-Trunc(i*YXScale),
Bmp.Width div 2 +i,Bmp.Height div 2 +Trunc(i*YXScale));
nr:=nr+dr;
ng:=ng+dg;
nb:=nb+db;
end;
end;
end;
armEllipse:
begin
YXScale:=Abs(Supplement/100);
f:=Distance(0,0,Bmp.Width,Bmp.Height);
n:=Trunc(Max(f/YXScale,f)/2);
dr:=(r2-r1)/n;
dg:=(g2-g1)/n;
db:=(b2-b1)/n;
nr:=r1;
ng:=g1;
nb:=b1;
with Bmp.Canvas do
begin
Pen.Mode:=pmCopy;
Pen.Style:=psSolid;
Pen.Width:=1;
for i:=n downto 0 do
begin
r:=Trunc(nr);
g:=Trunc(ng);
b:=Trunc(nb);
Pen.Color:=RGB(r,g,b);
Brush.Color:=Pen.Color;
if Supplement<0 then
Brush.Style:=bsClear
else
Brush.Style:=bsSolid;
if Pen.Color<>OldColor then
begin
OldColor:=Pen.Color;
Ellipse(Bmp.Width div 2-i,Bmp.Height div 2 -Trunc(YXScale*i),
Bmp.Width div 2+i,Bmp.Height div 2 +Trunc(YXScale*i));
end;
nr:=nr+dr;
ng:=ng+dg;
nb:=nb+db;
end;
end;
end;
end;//case
ACanvas.CopyMode:=cmSrcCopy;
ACanvas.CopyRect(ARect,Bmp.Canvas,Rect(0,0,Bmp.Width,Bmp.Height));
Bmp.Free;
end;
Top
20 楼ingener(祝福)回复于 2003-08-20 22:29:19 得分 0
还没有人解决
再顶Top
21 楼windwather(流年似水)回复于 2003-08-21 00:31:07 得分 1
我也不会,帮你顶了。顺便学习。Top
22 楼tonylk(=www.tonixsoft.com=)回复于 2003-08-21 10:50:34 得分 0
我说的那个方法一定可以,效率其实也不低,你到底试过没有,不要妄想着有人会把代码写好了给你。Top
23 楼hiflower(花)回复于 2003-08-21 12:24:00 得分 0
同意楼上
其实我的方法也是可行的Top
24 楼ingener(祝福)回复于 2003-08-21 19:53:34 得分 0
上面的方法我试过了,在FORM里的结果是可以的,但是我做的是一个控件,控件实现的结果却是还是上面的样子(我的主题上提到的)Top
25 楼hiflower(花)回复于 2003-08-21 20:38:49 得分 0
这就很奇怪了,Form 的Canvas 与你的控件的 Canvas 难道还有不同了
你的控件从什么继承来的Top
26 楼ingener(祝福)回复于 2003-08-21 20:53:06 得分 0
TGraphicControl 继承的。Top
27 楼ingener(祝福)回复于 2003-08-21 20:53:40 得分 0
我又动态创建了一个BITMAP可是好象有问题。Top
28 楼tonylk(=www.tonixsoft.com=)回复于 2003-08-21 21:38:16 得分 0
动态创建的bitmap在绘图前记得设置大小,以及PixelFormat,肯定不会有问题的,Top
29 楼ingener(祝福)回复于 2003-08-22 09:54:31 得分 0
tonylk(tony)谢谢,正在努力当中。Top
30 楼tjff2000(fengyun)回复于 2003-08-22 10:41:52 得分 2
你可以用
hr:HRGN;
hr:=CreateEllipticRgn(0,1,300,200); //形成一椭圆区域
SetWindowRgn(handle,hr,true); //形成椭圆的初始化窗体
再用渐进色填充即可。Top




