如何平移和旋转图像

时间:2018-07-06 06:48:04

标签: c# wpf image rotation

我要旋转,然后在c#中移动图像。该图像位于“画布”中。我的问题是,如果您使用以下内容旋转图像

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

或RotateTransform

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

您只是旋转“图片”,但不是它的基础。因此,如果要使用Canvas.GetLeft / GetTop移动图像,它的行为就像仍然没有旋转一样。因此,如果您设置“顶角/左角”,则旋转图像的实际角不会放置在我想要的位置。 在https://wpf.2000things.com/2013/03/08/772-use-rendertransformorigin-to-change-center-point-for-rotation-transforms/的图片中,您可以看到我的意思。如何旋转带有实际图像的“底座”?我看到WinForms中有可能,但是(如何)在WPF中工作? 在此先感谢您,如果不确定/错误,我将编辑我的问题。

编辑: https://i.stack.imgur.com/tqhKw.png 您可以看到两个箭头。它们是我的照片。我通过上面的MouseWheelEvent在中心旋转了它们。在正确的位置上有我的运动标签。您可以更改速度(“ Geschwindigkeit”之后的复选框),然后可以在一个区域中向左转(在画布中,-是0°,|是22.5°,||是45°,并且一个区域是69点)或正确并最终移至新位置。

1 个答案:

答案 0 :(得分:1)

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

将此图片放在画布中

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