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;
}
}
}