【问题标题】:How to crop a cross rectangle from an image using c#?如何使用 C# 从图像中裁剪十字矩形?
【发布时间】:2012-01-31 17:10:33
【问题描述】:

我想获取图像的某些特定部分,因此我正在裁剪图像。但是,当我想要获得与图像不平行的部分时,我会旋转图像并随后裁剪。

我不想旋转图像并裁剪平行矩形。我想要的是,在不旋转图像的情况下,裁剪一个与图像有一定角度的矩形。

有什么办法吗?

我觉得我表达得不够好。这就是我想做的:example picture.

假设红色的东西是一个矩形 :) 我想从图像中裁剪出那个东西。剪裁后不需要剪角。所以mj可以躺下。

【问题讨论】:

  • 这需要完整的 360 度旋转吗?还是 90?
  • 它不在网络应用程序中。实际上,度数会发生变化,可能是 32,90。
  • 您当前如何定义要裁剪的部分?一个矩形和一个角?图像是围绕它的中心旋转还是围绕裁剪矩形的中心旋转?
  • @rotem。我不想旋转图像。图像将保持原样。但我裁剪的矩形将根据图像倾斜。
  • 我在问你可以通过什么方式定义你想要裁剪的区域?是多边形,还是矩形+角?

标签: c# image-processing crop image-rotation


【解决方案1】:

这个方法应该执行你所要求的。

public static Bitmap CropRotatedRect(Bitmap source, Rectangle rect, float angle, bool HighQuality)
{
    Bitmap result = new Bitmap(rect.Width, rect.Height);
    using (Graphics g = Graphics.FromImage(result))
    {
        g.InterpolationMode = HighQuality ? InterpolationMode.HighQualityBicubic : InterpolationMode.Default;
        using (Matrix mat = new Matrix())
        {
            mat.Translate(-rect.Location.X, -rect.Location.Y);
            mat.RotateAt(angle, rect.Location);
            g.Transform = mat;
            g.DrawImage(source, new Point(0, 0));
        }
    }
    return result;
}

用法(使用您的 MJ 示例):

Bitmap src = new Bitmap("C:\\mjexample.jpg");
Rectangle rect = new Rectangle(272, 5, 100, 350);
Bitmap cropped = CropRotatedRect(src, rect, -42.5f, true);

【讨论】:

  • 非常感谢。这很完美。只是想知道这会影响图像质量吗?
  • 它会影响图像质量,就像任何旋转(90 度除外)都会不可避免地影响质量一样。如果答案是您所需要的,请接受它作为答案。
  • 对不起,但我现在必须再问一件事:(。如果矩形超出图像尺寸我该怎么办?实际上在这种情况下,我想从起点后面取出超出部分. 如果我再次直观地解释它:) 它应该是这样的:imageshack.us/photo/my-images/215/smoothcriminalleanexcee.jpg 实际上它仍然是一个矩形,如你所见。矩形的大小或起点没有任何变化..
  • 我以为我明白你想要什么,但你的例子让我很困惑。起点在哪里,形状是什么?
  • 是的,你理解的没错,但我之前忘了告诉这个。实际上什么都没有改变。如果你仔细看,当你从那个奇怪的拼图部分合并这两个部分时,它仍然是一个矩形。我想要的仍然是裁剪一个矩形。但是当超出图像尺寸时,我不想得到空白的背景颜色。我想继续种植。从哪里种植?从起始边缘的后面裁剪尽可能多的矩形大小。所以它会在它开始的地方完成。我希望我足够清楚
猜你喜欢
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多