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 ステートメントによって決定されます。

画像を元の座標に戻そうとすると、右側の画像から、ソースの四角形がターゲットの四角形と同じサイズまたは形状ではないため、画像が歪んで縮小されていることがわかります。

ジオメトリのスキルが高ければ、新しい四角形の境界を確実に計算して、キャンバスの正しい位置に適用できます。しかし悲しいかな、私にとっては高校数学から何年も経ちました。1回限りの計算では、それを理解できると確信していますが、ソース画像の形状が変わる可能性がある場合はそうではありません.

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

最後の行の代わりにこのコードを貼り付けます。あなたが望むものを手に入れることを願っています:)

ここに画像の説明を入力

縦横比が異なる別の四角形に 1 つの四角形を描画しようとすると、スケールが発生します (ゆがみのように見えます)。

于 2017-09-27T16:38:21.223 に答える