Размещение повернутого изображения с помощью ImageSharp - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь повернуть (вокруг его центра) и поместить изображение поверх другого изображения.

После поворота координаты XY, в которых я ожидал, все неверно.

Пример того, как это сделать, будет очень полезен

В настоящее время я рисую отладочные кадры вместо изображения.

Моя система координат основана на центральной позиции размещения, но яможет переключиться на верхний левый для координат XY

private static void DrawDebugFrames(List<LogoPlacementContentDto> placements, Image<Rgba32> mutatedImage)
{
    foreach (var placement in placements)
    {
        var width = placement.Width;
        var height = placement.Height;

        using (var logo = new Image<Rgba32>(Configuration.Default, width, height))
        {
            var centerX = placement.X; // center of imagePlacement
            var centerY = placement.Y; // center of imagePlacement

            var affineBuilder = new AffineTransformBuilder();
            affineBuilder.PrependTranslation(new Vector2(centerX, centerY));
            affineBuilder.PrependRotationDegrees(placement.Rotation);

            logo.Mutate(
                x => x
                    .BackgroundColor(Rgba32.Beige).DrawPolygon(
                        Rgba32.HotPink,
                        4,
                        new Vector2(0, 0),
                        new Vector2(width, 0),
                        new Vector2(width, height),
                        new Vector2(0, height)
                    )
                    .Transform(affineBuilder)
            );

            mutatedImage.Mutate(
                x => x
                    .DrawImage(logo, new Point(-(width / 2), -(height / 2)), GraphicsOptions.Default)
            );
        }
    }
}

(Изображение) Ожидаемый результат (редактор)

(Изображение) Результат

1 Ответ

1 голос
/ 04 июля 2019

Мне удалось решить эту проблему.

Проблема заключалась в том, что клиент никогда не отправлял координату XY ограничительной рамки.Вместо этого я попытался использовать XY верхнего левого угла или центральную позицию XY.

С этим исправлено.я немного скорректировал код, чтобы отразить это изменение.

private static void DrawDebugFrames(List<LogoPlacementContentDto> placements, Image<Rgba32> mutatedImage)
{
    foreach (var placement in placements)
    {
        var width = placement.WidthInt;
        var height = placement.HeightInt;

        using (var logo = new Image<Rgba32>(Configuration.Default, width, height))
        {
            var positionX = placement.Position.X;
            var positionY = placement.Position.Y;

            var affineBuilder = new AffineTransformBuilder();

            affineBuilder.PrependTranslation(new Vector2(positionX, positionY));
            affineBuilder.PrependRotationDegrees(placement.Rotation);
            affineBuilder.AppendTranslation(new Vector2(-positionX, -positionY));

            logo.Mutate(
                x => x
                    .BackgroundColor(Rgba32.Beige).DrawPolygon(
                        Rgba32.HotPink,
                        4,
                    new Vector2(0, 0),
                    new Vector2(width, 0),
                    new Vector2(width, height),
                    new Vector2(0, height)
                    )
                    .Transform(affineBuilder)
            );

            mutatedImage.Mutate(
                x => x
                    .DrawImage(logo, new Point(placement.Position.XInt, placement.Position.YInt), GraphicsOptions.Default)
            );
        }
    }
}
...