旋转ImageSource?

sim*_*imo 3 c# wpf grid image image-rotation

我在这样的DC(DrawingContext)上绘制Grid

dc.DrawImage(_imageSource, new Rect(x, y, width, height);
Run Code Online (Sandbox Code Playgroud)

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

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

任何的想法?

Cle*_*ens 5

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

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

或者,您可以创建一个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);
Run Code Online (Sandbox Code Playgroud)

实际上所有的DrawingContext.Draw ...方法都会创建并绘制适当的Drawing对象。


除了可以使用重写的OnRender()方法连续重绘所有内容之外,您还可以执行以下操作:

  • 创建一个DrawingVisual作为图形的容器。有关如何执行此操作,请参见使用DrawingVisual Objects

  • 与ImageDrawing创建DrawingGroup如上所示并画出DrawingGroup 一旦进入的DrawingContext提供由DrawingVisual.RenderOpen

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

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