WPF drawingContext.DrawImage 遇到的问题

起因

由于插入图片的需要,所以继承 Stroke 写了一个 ImageStroke,但是发现在使用默认的 Transform 来实现旋转操作会达不到预期的效果(没有旋转而是发生了预期外的形变),故只能找别的办法。

一开始的思路

首先保存一个图片的 Rect 对象,保证这个对象不会被 Transform 旋转。然后再保存旋转的角度再 DrawCore 里面调用 drawingContext.PushTransform(transform); 来对最终渲染的图形进行旋转,每次平移时对 offset 进行旋转运算,再将计算后的偏移量修改到保存的 Rect 对象之中。

但后来发现这样做出来的平移还是会造成偏移,导致旋转后的图形没法正常平移。只能寻求其他解决办法。

最终解决办法

同样也保存一个 Rect 对象并 创建一个 Martix 对象来保存最终的 Transform 结果,然后重载 Transform 方法,将方法中传入的 transformMatrix 使用 Append 添加到之前创建的 Martix 对象之中。最后在 DrawCore 里将 Martix 构建成 MatrixTransform 调用 drawingContext.PushTransform 以影响最终渲染效果,即可。

Martix 的坑

完成之后整理代码的时候把 Martix 的声明改成了这种形式

   public Matrix RenderMatrix {get;set;} = new Matrix();

结果发现,最终渲染的图像已经不能跟随 Transform 做出变化。原因不明。

然后又把代码恢复之后逐步排查发现是 Matrix 造成的,但不知道具体原因。

解决办法就是把 Martix 改成下面形式就可以

        public Matrix RenderMatrix => _renderMatrix;

        public Rect OriginRect { get; private set; }

你可能感兴趣的:(WPF,C#)