2

我正在寻找一种使用 Win2D 围绕其中心点旋转矩形图像(或任何图像)的方法。

此片段来自 Win2D 画布的 OnDraw 方法:

var redBitMap = _images[1];
var yellowBitMap = _images[2];

var rect = new Rect(topLeft.X, topLeft.Y, _width, _height);
_drawingSession.DrawImage(redBitMap, rect);

ICanvasImage image = new Transform2DEffect
{
   Source = yellowBitMap,
   TransformMatrix = Matrix3x2.CreateRotation((float)(60 * Math.PI / 180)),
};
var sourceRect = image.GetBounds(_drawingSession);
_drawingSession.DrawImage(image, rect), sourceRect, 1, CanvasImageInterpolation.HighQualityCubic);

这种方法使我的图像旋转了 60 度,但图像最终被绘制在错误的坐标处,倾斜并且比预期的图像小。

有趣的是,如果我将矩形的大小更改为正方形(使高度与宽度相同),则图像不再倾斜。

黄色十六进制超过红色十六进制

在考虑了更多之后,这就是正在发生的事情: 实际发生

因此,黄色矩形代表我想要(在中心)旋转 60 度的图像。固定在左上角的红色矩形是我旋转它时发生的事情。大蓝色框是由 image.GetBounds 语句确定的新矩形。

当我尝试将图像绘制回原始坐标时,您可以从右侧图像中看到它导致图像倾斜和缩小,因为源矩形不再与目标矩形具有相同的大小或形状。

如果我的几何技能更好,我肯定可以计算出新矩形的边界并将它们应用到画布上的正确位置。但唉,对我来说,距离高中数学已经太多年了。在一次性计算中,我确信我可以弄清楚 - 但不是在源图像的形状可能发生变化时。

4

2 回答 2

2

这是线索:

        var scaleFactor = rect.Height / rect.Width;

        ICanvasImage image2 = new ScaleEffect
        {
            Source = image,
            Scale = new Vector2((float)scaleFactor, 1)
        };

        args.DrawingSession.DrawImage(image2, rect, sourceRect, 1, CanvasImageInterpolation.HighQualityCubic);

粘贴此代码而不是最后一行。希望你能得到你想要的:)

在此处输入图像描述

当您尝试将一个矩形绘制成具有不同纵横比的另一个矩形时,会发生缩放(看起来像歪斜)。

于 2017-09-27T16:38:21.223 回答
1

杰特,你的建议帮助我找到了答案。我需要做的不是使用 ScaleEffect,但这就是我需要的线索。最终的绘制图像需要考虑到不断变化的大小(与 ScaleEffect 的想法非常相似。这给我留下了以下代码行:

args.DrawingSession.DrawImage(image, new Rect(topLeft.X + (_width - sourceRect.Width)/2, topLeft.Y + (_height - sourceRect.Height)/2, sourceRect.Width, sourceRect.Height), sourceRect, 1, CanvasImageInterpolation.HighQualityCubic)
于 2018-03-04T12:26:13.500 回答