最近在做项目的时候有用到System.Drawing.Bitmap类和System.Drawing.Graphics类来画图并生成图片,但由于Graphics画图的坐标系默认是以左上角为原点的,实际项目中需要对图片进行翻转或者旋转操作,这就用到了Image类中的RotateFlip方法。
RotateFlip要求传入的参数是RotateFlipType类型的枚举,这里我先给出MSDN关于RotateFlipType的链接:https://docs.microsoft.com/zh-cn/dotnet/api/system.drawing.rotatefliptype?view=dotnet-plat-ext-6.0
但我觉得这些参数过于书面化,不能直观的看到效果,网上搜具体的实例也没有搜到,所以决定自己用代码写一个小实例来看看效果,顺便分享给大家。
通过查阅MSDN文档,或者通过Visual Studio的F12导航到定义,可以知道RotateFlipType一共有如下14个值,但其中有一半是重复的效果,只是换了种写法:
namespace System.Drawing
{
public enum RotateFlipType
{
RotateNoneFlipNone = 0,
Rotate180FlipXY = 0,
Rotate90FlipNone = 1,
Rotate270FlipXY = 1,
Rotate180FlipNone = 2,
RotateNoneFlipXY = 2,
Rotate270FlipNone = 3,
Rotate90FlipXY = 3,
RotateNoneFlipX = 4,
Rotate180FlipY = 4,
Rotate90FlipX = 5,
Rotate270FlipY = 5,
Rotate180FlipX = 6,
RotateNoneFlipY = 6,
Rotate270FlipX = 7,
Rotate90FlipY = 7,
}
}
下面我用一个小demo演示下各个枚举的具体含义,可以对比看到各个枚举分别对应的效果:
RotateFlipType参数 | 图例 |
---|---|
原始图像 | |
0. RotateNoneFlipNone 0. Rotate180FlipXY | |
1. Rotate90FlipNone 1. Rotate270FlipXY | |
2. Rotate180FlipNone 2. RotateNoneFlipXY | |
3. Rotate270FlipNone 3. Rotate90FlipXY | |
4. RotateNoneFlipX 4. Rotate180FlipY | |
5. Rotate90FlipX 5. Rotate270FlipY | |
6. Rotate180FlipX 6. RotateNoneFlipY | |
7. Rotate270FlipX 7. Rotate90FlipY |
实例代码如下:
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Bitmap bitmap = new Bitmap(100, 100);
Graphics graphics = Graphics.FromImage(bitmap);
graphics.Clear(Color.Black);
Pen pen = new Pen(Color.White, 2);
List<Point> pointList = new List<Point>();
pointList.Add(new Point(10, 50));
pointList.Add(new Point(70, 70));
pointList.Add(new Point(70, 90));
pointList.Add(new Point(10, 90));
pointList.Add(new Point(10, 50));
graphics.DrawLines(pen, pointList.ToArray());
// 0. 原始效果
//bitmap.RotateFlip(RotateFlipType.RotateNoneFlipNone);
// 同上
//bitmap.RotateFlip(RotateFlipType.Rotate180FlipXY);
// 1. 顺时针旋转90°
//bitmap.RotateFlip(RotateFlipType.Rotate90FlipNone);
// 同上
//bitmap.RotateFlip(RotateFlipType.Rotate270FlipXY);
// 2. 顺时针旋转180°
//bitmap.RotateFlip(RotateFlipType.Rotate180FlipNone);
// 同上
//bitmap.RotateFlip(RotateFlipType.RotateNoneFlipXY);
// 3. 顺时针旋转270°
//bitmap.RotateFlip(RotateFlipType.Rotate270FlipNone);
// 同上
//bitmap.RotateFlip(RotateFlipType.Rotate90FlipXY);
// 4. 水平翻转
//bitmap.RotateFlip(RotateFlipType.RotateNoneFlipX);
// 顺时针旋转180°,垂直翻转(效果同上)
//bitmap.RotateFlip(RotateFlipType.Rotate180FlipY);
// 5. 顺时针旋转90°后,水平翻转
//bitmap.RotateFlip(RotateFlipType.Rotate90FlipX);
// 顺时针旋转270°,垂直翻转(效果同上)
//bitmap.RotateFlip(RotateFlipType.Rotate270FlipY);
// 6. 顺时针旋转180°后,水平翻转
//bitmap.RotateFlip(RotateFlipType.Rotate180FlipX);
// 垂直翻转(效果同上)
//bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY);
// 7. 顺时针旋转270°后,水平翻转
//bitmap.RotateFlip(RotateFlipType.Rotate270FlipX);
// 顺时针旋转90°后,垂直翻转(效果同上)
//bitmap.RotateFlip(RotateFlipType.Rotate90FlipY);
string path = "D:/MyImage.jpg";
bitmap.Save(path);
//打开进程
ProcessStartInfo info = new ProcessStartInfo(path);
info.WorkingDirectory = Path.GetDirectoryName(path);
Process.Start(info);
}
}
}