【问题标题】:Draw a fluid set of circles in real time using WriteableBitmapEx使用 WriteableBitmapEx 实时绘制一组流畅的圆
【发布时间】:2013-12-02 18:49:01
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 对于绘图程序(如绘画),当已知鼠标事件点与直线相距很远时,通常会“跳过”它们。
  • 如何将图像放入 ImageBrush 并将其用作 InkCanvas 的背景?

标签: c# wpf image-processing writeablebitmap writeablebitmapex


【解决方案1】:

改用 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 个样条线,并且仅在用户绘制它时。

【讨论】:

  • 我对这个控件一无所知,我想我需要对 WPF 做一些学习。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
相关资源
最近更新 更多