{ 旋转图像特效
输入参数:
Image 要进行旋转特效的TImage
Angle 旋转的角度(以度为单位,例如90表示旋转90度)
SleepTime 特效的快慢控制
}
procedure Img_Rotate(Image:TImage;Angle:Extended;SleepTime:Word);
var
c1x,c1y,c2x,c2y:Integer;
p1x,p1y,p2x,p2y:Integer;
radius,n:Integer;
alpha:Extended;
c0,c1,c2,c3:TColor;
OldBmp:TBitmap;
begin
OldBmp:=TBitmap.Create;
try
OldBmp.Assign(Image.Picture.Graphic);
Image.Picture:=nil;
angle:=(Angle/180)*PI; //将角度转换为PI值
// 计算中心点
c1x:=OldBmp.Width div 2;
c1y:=OldBmp.Height div 2;
c2x:=c1x;
c2y:=c1y;
// 步骤数值number
if c2x < c2y then n:=c2y
else n:=c2x;
Dec(n,1);
// 开始旋转
for p2x:=0 to n do
begin
for p2y:=0 to n do
begin
if p2x=0 then alpha:=PI/2
else alpha:=ArcTan2(p2y,p2x);
radius:=Round(Sqrt((p2x*p2x)+(p2y*p2y)));
p1x:=Round(radius*Cos(angle+alpha));
p1y:=Round(radius*Sin(angle+alpha));
function CalAngle(PointX, PointY: Double): Double;
var
d1, d2, d3: Double;
begin
d1 := - PointX;
d2 := - PointY;
if d1 <> 0 then
begin
d3 := ArcTan(Abs(d2 / d1)) * 180 / PI;
if (d2 > 0) and (d1 < 0) then
d3 := 180 - d3
else if (d2 <= 0) and (d1 < 0) then
d3 := d3 + 180
else if (d2 < 0) and (d1 > 0) then
d3 := 360 - d3;
end
else
begin
if d2 > 0 then
d3 := 90
else if D2 < 0 then
d3 := 270
else
d3 := -1;
end;
Result := d3;
end;
var
d1, d2, d3, d4, d5, d6: Double;
pXf: XFORM;
RoMetafile: TMetafile;
RoMetafileCanvas: TMetafileCanvas;
R: TRect;
begin
if not Assigned(AWmf) or (Angle = 0) then
Exit;
if (AWmf.Width = 0) or
(AWmf.Height = 0) then
Exit;
with pXf do
begin
d3 := -Angle * PI / 180;
d1 := COS(d3);
d2 := SIN(d3);