1

我正在使用SixLabors.ImageSharp在 C# .NET Core 3.1 中以编程方式裁剪图像。您可以在下面找到一个有效的代码片段。

public static void ResizeImage(Image<Rgba32> input, Size dimensions)
{
    var options = new ResizeOptions
    {
      Size = dimensions,
      Mode = ResizeMode.Crop
    };

    input.Mutate(x => x.Resize(options));
}

它工作得很好,但我想允许用户根据一对给定的坐标裁剪图像。这意味着,裁剪将从这些坐标开始,而不是从原点 (0, 0) 开始。用这个工具可以做到吗?

到目前为止,我只能从图像角落开始裁剪。我希望能够从任何位置开始裁剪。例如,对于以下图像:

约翰·多伊

用户想要通过在 x 和 y 轴上移动裁剪来裁剪图片的中心部分。最终结果将是:

在此处输入图像描述

请注意,在给定的示例中,我已经剪掉了图像的角落。使用Imagesharp可以做到这一点吗?

4

2 回答 2

2

采用Rectangle.FromLTRB

using (var inputStream = File.OpenRead(Path.Combine(inPath, "john-doe.png")))
using (var image = Image.Load<Rgba32>(inputStream))
{
    // Generate some rough coordinates from the source.
    // We'll take 25% off each edge.
    var size = image.Size();
    var l = size.Width / 4;
    var t = size.Height / 4;
    var r = 3 * (size.Width / 4);
    var b = 3 * (size.Height / 4);

    image.Mutate(x => x.Crop(Rectangle.FromLTRB(l, t, r, b)));

    image.Save(Path.Combine(outPath, "john-doe-cropped.png"));
}
于 2020-05-26T15:30:24.943 回答
-1

尽管詹姆斯的回答为我指明了正确的方向,而且在我们之前在Imagesharp 的 gitter 讨论中的简短对话中,为我解决问题的是以下代码:

private static void ResizeImage(Image<Rgba32> input, int width, int height, int x, int y)
    {
        input.Mutate(img => img.Crop(Rectangle.FromLTRB(x, y, width+x, height+y)));
    }

在这段代码中,我在xandy轴上移动原始图像,并通过给定的 and 裁剪width图像height

于 2020-05-26T19:36:10.037 回答