如何平移和旋转图像

How to translate and rotate an image

我想在 C# 中旋转然后移动图像。图片在 Canvas 中。我的问题是,如果您使用以下

旋转图像
private void Schiff_OnMouseWheel(object sender, MouseWheelEventArgs e)
{
    Image _schiff = (Image)sender;

    if (!_schiff.IsMouseCaptured) return;

    Matrix _mat = _schiff.RenderTransform.Value;
    Point _mouse = e.GetPosition(_schiff);

    if (e.Delta > 0)
    {
        _mat.RotateAtPrepend(22.5, _mouse.X, _mouse.Y);
    }
    else
    {
        _mat.RotateAtPrepend(-22.5, _mouse.X, _mouse.Y);
    }

    MatrixTransform _mtf = new MatrixTransform(_mat);
    _schiff.RenderTransform = _mtf;
}

或旋转变换

double _angle = 0.0;

_angle += 22.5;
if (_angle == 360.0) _angle = 0.0;

RotateTransform _rotate = new RotateTransform(_angle, _schiff.Width / 2, _schiff.Height / 2);

_schiff.RenderTransform = _rotate;A

您只需旋转 "picture",但不是它的底座。所以如果你想用 Canvas.GetLeft/GetTop 移动图像,它的行为就像它仍然没有旋转一样。因此,如果您设置 Top/Left-corner,旋转图像的实际角不会放置在我想要的位置。 在https://wpf.2000things.com/2013/03/08/772-use-rendertransformorigin-to-change-center-point-for-rotation-transforms/,在图片中你可以看到我的意思。我怎么可能用实际图像旋转 "base" ?我看到它在 WinForms 中是可能的,但是它(如何)在 WPF 中工作? 在此先感谢,如果有任何问题 unclear/wrong 我会编辑我的问题。

编辑: https://i.stack.imgur.com/tqhKw.png 你可以看到两个箭头。它们是我的形象。我用上面的 MouseWheelEvent 在中心旋转了它们。在正确的网站上有我的运动标签。您可以更改速度("Geschwindigkeit" 后的复选框),然后您可以在一段中左转(其中 - 为 0°,| 为 22.5°,|| 为 45°,一段为 69 点) Canvas) 或向右并最终到达新位置。

您应该使用相对于 Canvas 的坐标来转换图像元素。

在 Canvas

中使用此图片
<Canvas x:Name="canvas">
    <Image Width="100"
           Source="C:\Users\Public\Pictures\Sample Pictures\Koala.jpg"
           MouseLeftButtonDown="OnMouseLeftButtonDown"
           MouseLeftButtonUp="OnMouseLeftButtonUp"
           MouseMove="OnMouseMove"
           MouseWheel="OnMouseWheel">
        <Image.RenderTransform>
            <MatrixTransform />
        </Image.RenderTransform>
    </Image>
</Canvas>

代码如下所示。

重要的部分是使用 e.GetPosition(canvas) 而不是设置子元素的 Canvas.LeftCanvas.TopRenderTransformOrigin 属性。所有转换都是通过其 RenderTransform.

中的单个矩阵完成的
private Point? mousePos;

private void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    ((IInputElement)sender).CaptureMouse();
    mousePos = e.GetPosition(canvas);
}

private void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    ((IInputElement)sender).ReleaseMouseCapture();
    mousePos = null;
}

private void OnMouseMove(object sender, MouseEventArgs e)
{
    if (mousePos.HasValue)
    {
        var element = (UIElement)sender;
        var transform = (MatrixTransform)element.RenderTransform;
        var matrix = transform.Matrix;
        var pos = e.GetPosition(canvas);
        matrix.Translate(pos.X - mousePos.Value.X, pos.Y - mousePos.Value.Y);
        transform.Matrix = matrix;
        mousePos = pos;
    }
}

private void OnMouseWheel(object sender, MouseWheelEventArgs e)
{
    var element = (UIElement)sender;
    var transform = (MatrixTransform)element.RenderTransform;
    var matrix = transform.Matrix;
    var pos = e.GetPosition(canvas);
    matrix.RotateAt(e.Delta > 0 ? 22.5 : -22.5, pos.X, pos.Y);
    transform.Matrix = matrix;
}