简体   繁体   English

使用ImageSharp放置旋转的图像

[英]Placing a rotated image with ImageSharp

I'm trying to rotate (around it's center) and place an image on top of another image. 我正在尝试旋转(围绕它的中心)并将图像放置在另一个图像的顶部。

After rotation, the XY coordinates i expected it to be in, is all wrong. 旋转后,我希望它所在的XY坐标全错了。

An example on how to do this would be greatly appreciated 一个有关如何执行此操作的示例将不胜感激

Currently drawing debug frames instead of an image. 当前正在绘制调试框架而不是图像。

My coordinate system is based on a center position of the placement, but i could switch to a Top Left one for the XY coordinates 我的坐标系基于放置的中心位置,但是我可以切换到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)
            );
        }
    }
}

(Image) Expected result (editor) (图片) 预期结果(编辑)

(Image) Result (图片) 结果

I was able to solve this. 我能够解决这个问题。

The issue was that the client never sent the XY coordinate of the bounding box. 问题是客户端从未发送过边界框的XY坐标。 Instead i tried to use the XY of the top left corner or the center position XY. 相反,我尝试使用左上角的XY或中心位置XY。

With this fixed. 与此固定。 i adjusted the code slightly to reflect this change. 我稍微调整了代码以反映此更改。

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)
            );
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM