首先复习一个公式,平面上的点绕原点逆时针旋转θº,则其坐标变换公式为:
其中,(x, y)为原图坐标,(x’, y’)为旋转后的坐标。它的逆变换公式为:
矩阵形式为:
和缩放类似,旋转后的图像的像素点也需要经过坐标转换为原始图像上的坐标来确定像素值,同样也可能找不到对应点,因此旋转也用到插值法。在此选用性能较好的双线性插值法。为提高速度,我在处理旋转90º、-90º、±180º时使用了镜像来处理。
以下是具体算法实现:
/// <summary>
/// 图像旋转
/// </summary>
/// <param name="srcBmp">原始图像</param>
/// <param name="degree">旋转角度</param>
/// <param name="dstBmp">目标图像</param>
/// <returns>处理成功 true 失败 false</returns>
public static bool Rotation(Bitmap srcBmp, double degree, out Bitmap dstBmp) {
if (srcBmp == null) {
dstBmp = null;
return false;
}
dstBmp = null;
BitmapData srcBmpData = null;
BitmapData dstBmpData = null;
switch ((int)degree) {
case 0:
dstBmp = new Bitmap(srcBmp);
break;
case -90:
dstBmp = new Bitmap(srcBmp.Height, srcBmp.Width);
srcBmpData = srcBmp.LockBits(new Rectangle(0, 0, srcBmp.Width, srcBmp.Height), ImageLockMode.ReadOnly, Pixel