首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 位图旋转后失真
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • 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  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • maozefa
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-23 09:34:521楼 得分:0
    可以使用GDI+。下面是一个旋转45度的例子。例子中使用的Gdiplus单元下载见http://blog.csdn.net/maozefa/archive/2007/11/12/1880484.aspx,如果使用其它GDI+单元,则例子中的Image.Width和Image.Height可能要改为Image.GetWidth和Image.GetHeight,uses Gdiplus也应改为相应的单元名。
    Delphi(Pascal) code
    uses Gdiplus; ... var Image: TGpImage; Matrix: TGpMatrix; g: TGpGraphics; cp: TGpPointF; begin Image := TGpImage.Create('d:\1-2.jpg'); g := TGpGraphics.Create(Canvas.Handle); g.DrawImage(Image, 0, 0, Image.Width, Image.Height); Matrix := TGpMatrix.Create; cp.X := Image.Width / 2; cp.Y := Image.Height / 2; Matrix.Translate(Image.Width, 0); Matrix.RotateAt(90, cp); g.SetTransform(Matrix); g.DrawImage(Image, 0, 0, Image.Width, Image.Height); g.Free; Matrix.Free; Image.Free; end;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • mygodsos
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-17 21:52:082楼 得分:0
    用GDI+方便,给你万一的GDI+课程链接,很详细http://del.cnblogs.com/
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Bear_hx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-18 12:20:293楼 得分:0
    顶1楼,是目前最好的办法,而且失真很小。
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved