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

5
我想获取图像的特定部分,因此我正在裁剪图像。然而,当我想要获取不与图像平行的部分时,我会旋转图像并在裁剪后进行裁剪。
我不想旋转图像并裁剪一个平行的矩形。我想要的是,在不旋转图像的情况下,从图像中裁剪一个角度的矩形。
有没有办法这样做?
我觉得我表达得不够清楚。这就是我想做的事情:示例图片
假设红色物体是矩形 :) 我想把那个东西裁剪出来。裁剪后它不需要倾斜。所以Mj可以躺下。

需要进行完整的360度旋转吗?还是90度就可以了? - AlanFoster
它不在一个网络应用程序中。实际上,度数可能会改变,可以是32度、90度或其他。 - user1125953
你目前是如何定义想要裁剪的部分的?使用矩形和角度吗?图像是围绕其中心旋转还是围绕裁剪矩形的中心旋转? - Rotem
@rotem。我不想旋转图像。图像将保持原样。但是,我要根据图像对裁剪的矩形进行角度调整。 - user1125953
我想问你如何定义你想要裁剪的区域?是多边形还是矩形+角度? - Rotem
显示剩余3条评论
1个回答

6
这个方法应该执行您所要求的功能。
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);

非常感谢。这个完美地运作了。只是想知道这会不会影响图像质量? - user1125953
它会像任何旋转一样影响图像质量(除了90度的旋转)。如果这个答案是你需要的,请接受它作为答案。 - Rotem
抱歉,我现在必须再问一件事情 :(. 如果矩形超过图像尺寸怎么办?实际上,在这种情况下,我想从起始点后面获取超出的部分。如果我再次通过视觉方式解释 :),它应该是这样的:http://imageshack.us/photo/my-images/215/smoothcriminalleanexcee.jpg/实际上,正如您所看到的那样,它仍然是一个矩形。矩形的大小或起始点都没有改变。 - user1125953
非常重要的是,您必须使用DrawImage的矩形重载版本,否则根据DPI缩放图像时可能会出现错误。即使用:g.DrawImage(source, new Rectangle(0, 0, source.Width, source.Height));。请参见http://stackoverflow.com/a/15712490/65387。 - mpen
我偶然发现了这个概念,并在我正在进行的项目中使用了它。我发现我必须用 mat.RotateAt(-angle, rect.Location); 替换 mat.RotateAt(angle, rect.Location); 否则它会逆时针旋转而不是顺时针旋转。 我对c#还很陌生,所以我无法向任何人解释原因,但是对于其他发现此问题的人来说,这是一个提示。只有在通过测试模式运行后,我才弄清楚它在做什么。 - chip
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接