图像旋转,是指按照给定的角度,计算出图像每个像素坐标点在新图像上的坐标位置,从而实现整个图像坐标变换的图像处理手段。其像素坐标的变换公式为:
(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); // 取得左上角和