使用WriteableBitmapEx实时绘制一组流体

时间:2013-12-02 18:49:02

标签: c# wpf image-processing writeablebitmap writeablebitmapex

我有一个WriteableBitmap对象,我将.jpg图像加载到图像控件中并显示它。现在我希望能够让用户使用一个半透明的画笔在该图像上绘制。

现在我正在处理MouseDown和MouseMove事件,以便在每次更改鼠标在图像上的坐标时绘制一个半透明的圆圈:

MyWriteableBitmap.FillEllipseCentered(x, y, 1, 1, myColor);

但显然不能快速刷新 - 给我留下一组点(除非用户移动鼠标非常慢)。

我的临时解决方案是从一个点到另一个点绘制线条并更新每个MouseMove事件的两个点 - 曲线是一致的,但只有一个像素宽,看起来并不好。 / p>

解决这个问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

通过使用InkCanvas,您将获得更好的性能并自动转换为样条线(如果您需要):

<InkCanvas>
    <InkCanvas.DefaultDrawingAttributes>
        <DrawingAttributes Color="Blue" Width="8" Height="8" FitToCurve="True" />
    </InkCanvas.DefaultDrawingAttributes>
</InkCanvas>

如果需要,您可以随时将其渲染为位图:

RenderTargetBitmap bitmap = new RenderTargetBitmap((int)theCanvas.ActualWidth, (int)theCanvas.ActualHeight, 96d, 96d, PixelFormats.Default);
bitmap.Render(theCanvas);

更新:这适用于透明刷子以及BTW,以及压力敏感笔(如果启用)。主要问题是随着用户绘制越来越多的线条,性能会下降,但您可以通过渲染到位图然后将该位图设置为InkCanvas背景来轻松修复它,即InkCanvas不应该永远不会显示超过1个样条曲线,仅在用户绘制时。