C# 旋转图像源?

C# 旋转图像源?,c#,wpf,image,grid,image-rotation,C#,Wpf,Image,Grid,Image Rotation,我在dc(DrawingContext)绘制一个网格,如下所示: dc.DrawImage(_imageSource, new Rect(x, y, width, height); 但是,如果我想在绘图上下文中旋转正在绘制的图像,该怎么办 我知道我可以将效果推送到绘图上下文,但它会影响所有绘图,而我只想旋转\u imageSource的绘图 有什么想法吗?您可以在绘制图像之前推动旋转变换,然后在绘制后立即弹出变换 var transform = new RotateTransform(...)

我在dc(DrawingContext)绘制一个
网格
,如下所示:

dc.DrawImage(_imageSource, new Rect(x, y, width, height);
但是,如果我想在绘图上下文中旋转正在绘制的图像,该怎么办

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


有什么想法吗?

您可以在绘制图像之前推动旋转变换,然后在绘制后立即弹出变换

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()方法中不断重画所有内容:

  • 创建一个容器作为图形的容器。看看怎么做

  • 使用如上所示的ImageDrawing创建DrawingGroup,并将DrawingGroup绘制到由提供的DrawingContext中

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

  • 当图像的位置或旋转角度更改时,仅更改相关变换。不需要重新绘制


我想到了这一点,但它会对性能产生负面影响,更好的解决方案是将_imageSource旋转一次,而不是推动和弹出。只要图像没有移动,就可以保留DrawingGroup。我不相信这会对表现产生负面影响。你是否观察到了这种效果,或者只是害怕它?我们观察到了推和弹出时对性能的负面影响,是的,我们正在移动和旋转,上面的x和y不固定。你是否在使用覆盖的OnRender()方法执行此操作,该方法会在图像更改时调用?有多少图像?是的,我在重写的OnRender()中绘制,我只有两个图像,当我直接绘制图像资源而不进行转换时,可以接受性能。。我们这里的是一个图形应用程序,我们需要两个光标同时移动,我们不能只更改光标,因为我们需要两个光标,所以,在上下文上绘图是相对被接受的解决方案。。