私は次のGrid
ようなdc(DrawingContext)で描画しています:
dc.DrawImage(_imageSource, new Rect(x, y, width, height);
しかし、描画コンテキストで描画している画像を回転させたい場合はどうなりますか?
効果を描画コンテキストにプッシュできることはわかっていますが、の描画のみを回転させたいので、すべての描画に影響します_imageSource
。
何か案が?
私は次のGrid
ようなdc(DrawingContext)で描画しています:
dc.DrawImage(_imageSource, new Rect(x, y, width, height);
しかし、描画コンテキストで描画している画像を回転させたい場合はどうなりますか?
効果を描画コンテキストにプッシュできることはわかっていますが、の描画のみを回転させたいので、すべての描画に影響します_imageSource
。
何か案が?
画像を描画する前に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...メソッドは、実際に適切なDrawingオブジェクトを作成および描画します。
オーバーライドされたOnRender()メソッドですべてを継続的に再描画する代わりに、次のことも実行できます。
図面のコンテナとしてDrawingVisualを作成します。その方法については、 DrawingVisualオブジェクトの使用を参照してください。
上記のようにImageDrawingを使用してDrawingGroupを作成し、DrawingVisual.RenderOpenによって提供されるDrawingContextにDrawingGroupを1回描画します。
完全な画像変換、つまり平行移動と回転には、MatrixTransformまたはTransformGroupを使用します。DrawingGroup.Transformプロパティをこの変換に設定します(上記のようにRotateTransformのみではありません)。
画像の位置または回転角が変更された場合は、関連する変換のみを変更してください。再描画は必要ありません。