-

- 加为好友
- 发送私信
- 在线聊天
-
xiaong
- 等级:

- 可用分等级:
- 总技术分:
- 总技术分排名:
- 结帖率:
|
| 发表于:2008-08-21 15:53:04 楼主 |
procedure TForm1.bmp_rotate(Srcbmp, DestBmp: Tbitmap; angle: extended); var c1x, c1y, c2x, c2y: integer; p1x, p1y, p2x, p2y: integer; radius, n: integer; alpha: extended; c0, c1, c2, c3: tcolor; begin if SrcBmp.Width > SrcBmp.Height then begin DestBmp.width := SrcBmp.Width; DestBmp.height := SrcBmp.Width; end else DestBmp.Width := SrcBmp.Height; DestBmp.Height := SrcBmp.Height; //将角度转换为PI值 angle := (angle / 180) * pi; // 计算中心点,你可以修改它 c1x := SrcBmp.width div 2; c1y := SrcBmp.height div 2; c2x := DestBmp.width div 2; c2y := DestBmp.height div 2; // 步骤数值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)); c0 := SrcBmp.canvas.pixels[c1x + p1x, c1y + p1y]; c1 := SrcBmp.canvas.pixels[c1x - p1x, c1y - p1y]; c2 := SrcBmp.canvas.pixels[c1x + p1y, c1y - p1x]; c3 := SrcBmp.canvas.pixels[c1x - p1y, c1y + p1x]; DestBmp.Canvas.pixels[c2x + p2x, c2y + p2y] := c0; DestBmp.canvas.pixels[c2x - p2x, c2y - p2y] := c1; DestBmp.canvas.pixels[c2x + p2y, c2y - p2x] := c2; DestBmp.canvas.pixels[c2x - p2y, c2y + p2x] := c3; end; application.processmessages end; end; 这是在网上找的一段算法,但是出现很严重的失真,有没有好的办法避免?急! |
|
|
|
100
修改
删除
举报
引用
回复
| |