图像旋转实现,简单粗暴上代码
public static void Flip(IntPtr image, int width, int height, RotateFlipType rotateFlipType)
{
switch (rotateFlipType)
{
case RotateFlipType.RotateNoneFlipNone:
RotateNoneFlipNone(image, width, height);
break;
case RotateFlipType.Rotate90FlipNone:
Rotate90FlipNone(image, width, height);
break;
case RotateFlipType.Rotate180FlipNone:
Rotate180FlipNone(image, width, height);
break;
case RotateFlipType.Rotate270FlipNone:
Rotate270FlipNone(image, width, height);
break;
case RotateFlipType.RotateNoneFlipX:
Rotate180FlipY(image, width, height);
break;
case RotateFlipType.Rotate90FlipX:
Rotate90FlipX(image, width, height);
break;
case RotateFlipType.Rotate180FlipX:
Rotate180FlipX(image, width, height);
break;
case RotateFlipType.Rotate270FlipX:
Rotate270FlipX(image, width, height);
break;
default:
throw new ArgumentOutOfRangeException(nameof(rotateFlipType), rotateFlipType, null);
}
}
private static void RotateNoneFlipNone(IntPtr image, int width, int height)
{
}
/// <summary>
/// 顺时针旋转90
/// </summary>
/// <param name="image"></param>
/// <param name="width"></param>
/// <param name="height"></param>
private static void Rotate90FlipNone(IntPtr image, int width, int height) //顺时针90
{
unsafe
{
ushort* image_ptr = (ushort*)image.ToPointer();
int pixel_num = width * height;
ushort[] image_expand = new ushort[pixel_num];
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
int i1 = j;
int j1 = height - i - 1;
image_expand[i1 * height + j1] = image_ptr[i * width + j];
}
}
Copy(image_expand, image, (uint)pixel_num);
}
}
/// <summary>
/// 顺时针旋转180度
/// </summary>
/// <param name="image"></param>
/// <param name="width"></param>
/// <param name="height"></param>
private static void Rotate180FlipNone(IntPtr image, int width, int height)
{
unsafe
{
ushort* image_ptr = (ushort*)image.ToPointer();
int pixel_num = width * height;
UInt16[] image_expand = new ushort[pixel_num];
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
int i1 = height - i - 1;
int j1 = width - j - 1;
image_expand[i1 * width + j1] = image_ptr[i * width + j];
}
}
Copy(image_expand, image, (uint)pixel_num);
}
}
/// <summary>
/// 顺时针旋转270,逆时针旋转90°
/// </summary>
/// <param name="image"></param>
/// <param name="width"></param>
/// <param name="height"></param>
private static void Rotate270FlipNone(IntPtr image, int width, int height) //逆时针90
{
unsafe
{
ushort* image_ptr = (ushort*)image.ToPointer();
int pixel_num = width * height;
UInt16[] image_expand = new ushort[pixel_num];
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
int i1 = width - j - 1;
int j1 = i;
image_expand[i1 * height + j1] = image_ptr[i * width + j];
}
}
Copy(image_expand, image, (uint)pixel_num);
}
}
/// <summary>
/// 绕x轴翻转180,即上下镜像
/// </summary>
/// <param name="image"></param>
/// <param name="width"></param>
/// <param name="height"></param>
private static void Rotate180FlipX(IntPtr image, int width, int height)
{
unsafe
{
ushort* image_ptr = (ushort*)image.ToPointer();
int pixel_num = width * height;
UInt16[] image_expand = new ushort[pixel_num];
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
int i1 = height - 1 - i;
int j1 = j;
image_expand[i1 * width + j1] = image_ptr[i * width + j];
}
}
Copy(image_expand, image, (uint)pixel_num);
}
}
/// <summary>
/// 先顺时针旋转90,再上下镜像
/// </summary>
/// <param name="image"></param>
/// <param name="width"></param>
/// <param name="height"></param>
private static void Rotate90FlipX(IntPtr image, int width, int height)
{
unsafe
{
Rotate90FlipNone(image, width, height);
Rotate180FlipX(image, height, width);
}
}
/// <summary>
/// 绕Y轴翻转180,即左右镜像:即先旋转180,再上下镜像
/// </summary>
/// <param name="image"></param>
/// <param name="width"></param>
/// <param name="height"></param>
private static void Rotate180FlipY(IntPtr image, int width, int height)
{
unsafe
{
Rotate180FlipNone(image, width, height);
Rotate180FlipX(image, width, height);
}
}
/// <summary>
/// 先逆时针旋转90,再上下镜像
/// </summary>
/// <param name="image"></param>
/// <param name="width"></param>
/// <param name="height"></param>
private static void Rotate270FlipX(IntPtr image, int width, int height)
{
unsafe
{
Rotate270FlipNone(image, width, height);
Rotate180FlipX(image, height, width);
}
}