【问题标题】:Rotate ImageSource?旋转图像源?
【发布时间】:2012-11-26 23:50:54
【问题描述】:

我正在像这样在Grid 的 dc (DrawingContext) 绘图:

dc.DrawImage(_imageSource, new Rect(x, y, width, height);

但是,如果我想在绘图上下文中旋转我正在绘制的图像怎么办?

我知道我可以将效果推送到绘图上下文,但是它会影响所有绘图,而我只想旋转 _imageSource 的绘图。

有什么想法吗?

【问题讨论】:

    标签: c# wpf image grid image-rotation


    【解决方案1】:

    您可以在绘制图像之前推送 RotateTransform,并在绘制后立即弹出变换。

    var transform = new RotateTransform(...);
    dc.PushTransform(transform);
    dc.DrawImage(_imageSource, new Rect(x, y, width, height));
    dc.Pop();
    

    或者,您可以创建一个 ImageDrawing,将其添加到 DrawingGroup(具有 Transform 属性),然后绘制 DrawingGroup:

    var drawingGroup = new DrawingGroup();
    drawingGroup.Transform = new RotateTransform(...);
    drawingGroup.Children.Add(new ImageDrawing(_imageSource, new Rect(x, y, width, height)));
    dc.DrawDrawing(drawingGroup);
    

    所有 DrawingContext.Draw... 方法实际上创建和绘制适当的绘图对象。


    除了在重写的 OnRender() 方法中不断重绘所有内容之外,您还可以执行以下操作:

    • 创建一个DrawingVisual 作为绘图的容器。请参阅Using DrawingVisual Objects 了解如何执行此操作。

    • 如上所示使用 ImageDrawing 创建一个 DrawingGroup,然后将 DrawingGroup 一次绘制到 DrawingVisual.RenderOpen 提供的 DrawingContext 中。

    • 使用 MatrixTransform 或 TransformGroup 进行完整的图像转换,即平移和旋转。将 DrawingGroup.Transform 属性设置为此变换(而不是仅如上所示的 RotateTransform)。

    • 当图像的位置或旋转角度发生变化时,只改变相关的变换。不需要重绘。

    【讨论】:

    • 我想到了这个,但是它对性能有负面影响,更好的解决方案是让_imageSource旋转一次,而不是推动和弹出..
    • 只要图像不移动,就可以保留DrawingGroup。而且我不相信对性能的负面影响。您是否观察到这种影响,或者只是害怕它?
    • 我们观察到推和弹出时对性能的负面影响,是的,我们正在移动和旋转,上面的 x 和 y 不固定
    • 您是否在重写的 OnRender() 方法中执行此操作,每当您的图像更改时都会调用该方法?有多少张图片?
    • 是的,我在重写的 OnRender() 中绘图,我只有两个图像,当我直接绘制图像资源而不进行转换时,性能可以接受.. 我们这里有一个图形应用程序,并且我们需要两个光标同时移动,我们不能只改变光标,因为我们需要两个光标,所以,根据上下文绘制是相对接受的解决方案..
    猜你喜欢
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多