使用c#从图像中裁剪十字矩形

我想要做的是基本上从图像中裁剪一个矩形。 但是,它应该满足一些特殊情况:

  1. 我想在图像上裁剪一个有角度的矩形。
  2. 我不想旋转图像并裁剪矩形:)
  3. 如果裁剪超出图像大小,我不想裁剪空背景色。

我想从起点后面进行裁剪,这将在矩形尺寸完成时从起点开始。 我知道如果我在视觉上展示我想要的东西,我就无法解释清楚:

在此处输入图像描述

蓝点是那里的起点,箭头表示裁剪方向。 当裁剪超出图像边界时,它将返回到起始点的后面,当矩形宽度和高度完成时,矩形的末端将处于起始点。

此外,这是我提出的上一个问题:

  • 如何使用c#从图像中裁剪十字矩形?

在这个问题中,我无法预测图像尺寸会出现问题所以我没有要求它。 但现在有案例3.除了案例3,这是完全相同的问题。 我怎么能这样做,有什么建议吗?

需要做的是向矩阵对齐添加偏移量。 在这种情况下,我从每一侧获取一个额外长度的矩形(总共9个矩形)并每次偏移矩阵。

请注意,最后需要放置偏移0 (原始裁剪),否则会得到错误的结果。

另请注意,如果指定的矩形大于旋转的图片,则仍会显示空白区域。

 public static Bitmap CropRotatedRect(Bitmap source, Rectangle rect, float angle, bool HighQuality) { int[] offsets = { -1, 1, 0 }; //place 0 last! Bitmap result = new Bitmap(rect.Width, rect.Height); using (Graphics g = Graphics.FromImage(result)) { g.InterpolationMode = HighQuality ? InterpolationMode.HighQualityBicubic : InterpolationMode.Default; foreach (int x in offsets) { foreach (int y in offsets) { using (Matrix mat = new Matrix()) { //create the appropriate filler offset according to x,y //resulting in offsets (-1,-1), (-1, 0), (-1,1) ... (0,0) mat.Translate(-rect.Location.X - rect.Width * x, -rect.Location.Y - rect.Height * y); mat.RotateAt(angle, rect.Location); g.Transform = mat; g.DrawImage(source, new Point(0, 0)); } } } } return result; } 

要重新创建您的示例:

 Bitmap source = new Bitmap("C:\\mjexample.jpg"); Bitmap dest = CropRotatedRect(source, new Rectangle(86, 182, 87, 228), -45, true);