using OpenCvSharp; using PaintDotNet.Base; using System.Collections.Generic; using System.Drawing; namespace PaintDotNet.Adjust { /// /// 图像几何操作 /// public class GeometryIntent { /// /// 图像旋转,参考以下网址 /// https://blog.csdn.net/andylanzhiyong/article/details/84857915 /// /// 源 /// 目标 /// 角度 public static void ImageRotate(Mat src, Mat dst, FlipMode flipMode) { if (flipMode == FlipMode.XY) { Cv2.Flip(src, dst, flipMode); } else { Cv2.Transpose(src, dst); Cv2.Flip(dst, dst, flipMode); } } /// /// 图像偏移 /// public static Mat ImageOffset(Mat src, List lists) { //偏移量 int heightOffset = 0; int widthOffset = 0; Color color = Color.Red; for (int i = 0; i < lists.Count; i++) { Args args = lists[i]; switch (args.Key) { case "Vertical": heightOffset = int.Parse(args.Value.ToString()); break; case "Horizal": widthOffset = int.Parse(args.Value.ToString()); break; case "FillColor": color = Color.FromArgb(int.Parse(args.Value.ToString())); break; default: break; } } Mat dst = new Mat(); Point2f center = new Point2f(src.Cols / 2, src.Rows / 2); Mat rot = Cv2.GetRotationMatrix2D(center, 0, 1); rot.Set(0, 2, widthOffset * 1.0d); rot.Set(1, 2, heightOffset * 1.0d); Cv2.WarpAffine(src, dst, rot, src.Size(), InterpolationFlags.Linear, BorderTypes.Constant, new Scalar(color.B, color.G, color.R, 255)/*Scalar.FromRgb(color.R,color.G,color.B) 三通道用*/); dst.CopyTo(src); if (dst != null) dst.Dispose(); return src; } /// /// 图像任意角度旋转 /// /// 源 /// 目标 /// 弧度 /// 插值标志 public static void ImageRotate(Mat src, Mat dst, float angle, InterpolationFlags flags) { Mat dst1 = new Mat(); Point2f center = new Point2f(src.Cols / 2, src.Rows / 2); Mat rot = Cv2.GetRotationMatrix2D(center, -angle, 1); Size2f s2f = new Size2f(src.Size().Width, src.Size().Height); Rect box = new RotatedRect(new Point2f(0, 0), s2f, -angle).BoundingRect(); double xx = rot.At(0, 2) + box.Width / 2 - src.Cols / 2; double zz = rot.At(1, 2) + box.Height / 2 - src.Rows / 2; rot.Set(0, 2, xx); rot.Set(1, 2, zz); //对图片进行仿射变换 Cv2.WarpAffine(src, dst1, rot, box.Size, flags); dst1.CopyTo(dst); } /// /// 图像旋转 /// public static Mat MatRotate(Mat src, float angle, Scalar scalar) { Mat dst = new Mat(); Point2f center = new Point2f(src.Cols / 2, src.Rows / 2); Mat rot = Cv2.GetRotationMatrix2D(center, -angle, 1); Size2f s2f = new Size2f(src.Size().Width, src.Size().Height); Rect box = new RotatedRect(new Point2f(0, 0), s2f, -angle).BoundingRect(); double xx = rot.At(0, 2) + box.Width / 2 - src.Cols / 2; double zz = rot.At(1, 2) + box.Height / 2 - src.Rows / 2; rot.Set(0, 2, xx); rot.Set(1, 2, zz); Cv2.WarpAffine(src, dst, rot, box.Size, InterpolationFlags.Linear,0, scalar); return dst; } } }