Обрезка и перемещение изображений с помощью SixLabors.ImageSharp в C# - PullRequest
1 голос
/ 25 мая 2020

Я использую 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). Можно ли сделать это с помощью этого инструмента?

До сих пор я мог кадрировать только начиная с угла изображения. Я хочу иметь возможность обрезать, начиная с любой позиции. Например, для следующего изображения:

John Doe

Пользователь хочет обрезать центральную часть изображения, сдвинув обрезку по осям x и y. ось. Окончательный результат будет:

enter image description here

Обратите внимание, что в данном примере я обрезал углы изображения. Можно ли сделать это с помощью Imagesharp?

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Используйте 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"));
}
0 голосов
/ 26 мая 2020

Несмотря на то, что ответ Джеймса указал мне в правильном направлении, а также ранее в нашем кратком разговоре в обсуждении 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)));
    }

В этом коде я сдвигаю исходное изображение по оси x и y и обрезаю изображение по заданным width и height.

...