1

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

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

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

不过,这显然刷新得不够快 - 给我留下了一组点(除非用户移动鼠标非常非常慢)。

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

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

4

1 回答 1

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);

更新:这适用于透明画笔以及顺便说一句,也适用于压敏笔(如果启用)。主要问题是性能会随着用户绘制越来越多的线条而下降,但您可以通过渲染位图然后将该位图设置为 InkCanvas 背景来轻松解决该问题,即 InkCanvas 不应该永远显示超过1 个样条线,并且仅在用户绘制它时。

于 2013-12-02T21:51:37.693 回答