请问,怎么给一幅图片上的一个圆角矩形加上投影的效果? ( 积分: 46 )

  • 主题发起人 主题发起人 haoslm
  • 开始时间 开始时间
H

haoslm

Unregistered / Unconfirmed
GUEST, unregistred user!
请问,怎么给一幅图片上的一个圆角矩形加上投影的效果?我就这点分了
 
这个问题极易,其实就是一个图形剪裁的事...
//Canvas: 画布;x1: 图片圆角矩形的左上角x坐标,x2: 右下角x坐标,WidthEllipse: 形成圆角矩形的椭圆宽度,其他参数不多说了
procedure SetRoundRectShadow(Canvas: TCanvas; x1, y1, x2, y2, WidthEllipse, HeightEllipse: Integer);
var
hrgnFr, hrgnBk: HRGN;
begin
hrgnFr := CreateRoundRectRgn(x1, y1, x2, y2, WidthEllipse, HeightEllipse);
//4 是阴影宽度,如果你喜欢可以加宽
hrgnBk := CreateRoundRectRgn(x1 + 4, y1 + 4, x2 + 4, y2 + 4, WidthEllipse, HeightEllipse);
CombineRgn(hrgnBk, hrgnBk, hrgnFr, RGN_DIFF);
DeleteObject(hrgnFr);
FillRgn(Canvas.Handle, hrgnBk, GetStockObject(BLACK_BRUSH));
DeleteObject(hrgnBk);
end;
应该欧了吧...
 
你连问题都表述不清楚,还希望得到“想要的效果”??
如果您喜欢先粗线条描述问题,等别人回答后再让别人陪着你一起进行细化以达到“想要的效果”,那我恕不奉陪鸟,谢谢!
顺便善意提示一下,“PS那样的投影出来有立体感的效果”一句也很欠火候。
你坐这等吧。
 
to vvyang
对不起,可能我表达的不清楚,但是论坛不可以发图片,图片上的效果我又说不好,要不我把图片发给你,你帮帮我好吗?
 
To haoslm:
我的邮箱:zh5430@yahoo.com.cn
 
To haoslm:
不好意思,才看到,你不就是想加点渐变色,直说不就得了,拐弯抹角干吗啊。
需要用到 GDIPlus 系列单元,网上有的是。

uses GDIPAPI, GDIPOBJ;

function MakeColor(Color: TColor; Alpha: Byte): TGPColor;
var
rgb: COLORREF;
begin
rgb := ColorToRGB(Color);
Result := (GetBValue(rgb) shl BlueShift) or (GetGValue(rgb) shl GreenShift) or
(GetRValue(rgb) shl RedShift) or (DWORD(Alpha) shl AlphaShift);
end;

procedure SetRoundRectShadow(Canvas: TCanvas; x1, y1, x2, y2, WidthEllipse, HeightEllipse, Shadow: Integer;
Color1, Color2: TColor; Alpha: Byte);
var
g: TGPGraphics;
b: TGPLinearGradientBrush;
hrgnBk, hrgnFr: HRGN;
r: TGPRegion;
begin
g := TGPGraphics.Create(Canvas.Handle);
b := TGPLinearGradientBrush.Create(MakePoint(x1, y1), MakePoint(x2 + Shadow, y2 + Shadow),
MakeColor(Color1, Alpha), MakeColor(Color2, Alpha));
hrgnFr := CreateRoundRectRgn(x1, y1, x2, y2, WidthEllipse, HeightEllipse);
hrgnBk := CreateRoundRectRgn(x1 + Shadow, y1 + Shadow, x2 + Shadow, y2 + Shadow,
WidthEllipse, HeightEllipse);
CombineRgn(hrgnBk, hrgnBk, hrgnFr, RGN_DIFF);
r := TGPRegion.Create(hrgnBk);
g.FillRegion(b, r);
r.Free;
DeleteObject(hrgnFr);
DeleteObject(hrgnBk);
b.Free;
g.Free;
end;
//用的时候这样用
procedure TForm1.Button1Click(Sender: TObject);
begin
SetRoundRectShadow(Canvas, 100, 100, 300, 300, 60, 60, 8, clBlack, clBtnFace, 255);
end;
 
谢谢你的答案,非常感谢!
 
后退
顶部