Delphi图像处理 -- 图像旋转

图像旋转,是指按照给定的角度,计算出图像每个像素坐标点在新图像上的坐标位置,从而实现整个图像坐标变换的图像处理手段。其像素坐标的变换公式为:

(1)、x' = x * cos(angle) + y *sin(andle)

y' = x * -sin(angle)+y * cos(andle)

公式中,x',y'为变换后的像素坐标点,x,y为变换前像素坐标点,angle为旋转角度。

但是,按照上面的公式旋转图像,会出现多个原图像像素点对应新图像同一个点的问题,这不仅会多消耗图像旋转处理的时间,而且也会使旋转后的图像产生不必要的失真,如果是32位带Alpha通道像素格式的图像,更会因此造成图像的混乱,所以在实际的图像旋转处理代码中,是以目标图(旋转后的图像)的像素坐标点,逐点反推原图像素的位置,这样,目标图的各个像素点既不会重复,也不会遗漏。其计算公式为:

(2)、x = x' * cos(angle) - y' * sin(angle)

y = x' * sin(angle) + y' * cos(angle)

下面是Delphi图像旋转处理的代码:

过程定义: // 获取Width * Height图像旋转Angle时,完全包含图像所需尺寸 function GetRotateSize(Width, Height: Integer; Angle: Single): TSize; // 旋转图像,OffsetX和OffsetY分别为图像偏移量,为0时Source与Dest左上边对齐, // Angle顺时针旋转角度,Alpha不透明度,IpMode插值方式 procedure ImageRotate(var Dest: TImageData; OffsetX, OffsetY: Integer; const Source: TImageData; Angle: Single; Alpha: Single = 1.0; IpMode: TInterpolateMode = imDefault); overload; // TGraphic对象旋转到Dest procedure ImageRotate(var Dest: TImageData; OffsetX, OffsetY: Integer; const Source: TGraphic; Angle: Single; Alpha: Single = 1.0; IpMode: TInterpolateMode = imDefault); overload; // TGpBitmap对象旋转到Dest procedure ImageRotate(var Dest: TImageData; OffsetX, OffsetY: Integer; const Source: TGpBitmap; Angle: Single; Alpha: Single = 1.0; IpMode: TInterpolateMode = imDefault); overload; 代码实现: type TPointF = record X: Single; Y: Single; end; TRectF = record X: Single; Y: Single; Width: Single; Height: Single; end; function GetTransformSize(m11, m12, m21, m22, x, y, Width, Height: Single): TRectF; function GetTransPoint(x, y: Single): TPointF; begin Result.X := m11 * x + m21 * y; Result.Y := m12 * x + m22 * y; end; var pf: array[0..3] of TPointF; I: Integer; begin // 分别计算四个角的相对坐标 pf[0] := GetTransPoint(x, y); pf[1] := GetTransPoint(Width + x, y); pf[2] := GetTransPoint(x, Height + y); pf[3] := GetTransPoint(Width + x, Height + y); // 取得左上角和

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值