1

У меня есть объект WriteableBitmap, в который я загружаю изображение .jpg и отображаю его в элементе управления изображением. Теперь я хочу, чтобы пользователь мог нарисовать на этом изображении небольшую полупрозрачную кисть.Нарисуйте жидкий набор кругов в реальном времени с помощью WriteableBitmapEx

Сейчас я обработка событий MouseDown и MouseMove нарисовать небольшой полупрозрачный круг при каждом изменении координат мыши над изображением:

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

Это явно не обновляется достаточно быстро, хотя - оставляя меня с набором точек (если пользователь не перемещает мышь очень медленно).

Мое временное решение состоит в том, чтобы просто нарисовать линии из одной точки в другую и обновить две точки на каждом событии MouseMove - кривая согласована таким образом, но имеет только однопиксельную ширину, что не выглядит великолепно.

Каков наилучший подход для решения этой проблемы?

+0

Для рисования программ (например, красок) типично «пропускать» между известными точками события мыши, когда они далеко друг от друга с проливной линией. –

+0

Как поместить изображение в ImageBrush и использовать его в качестве фона [InkCanvas] (http://msdn.microsoft.com/en-us/library/System.Windows.Controls.InkCanvas (v = vs.110)) .aspx)? – Clemens

ответ

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

UPDATE: это работает для прозрачных кистей, а также BTW, а также чувствительные к давлению ручки (если он включен). Основная проблема заключается в том, что производительность снижается по мере того, как пользователь рисует все больше и больше строк, но вы можете легко исправить это путем рендеринга в растровое изображение, а затем установить, что растровое изображение является фоном InkCanvas, то есть InkCanvas не должен отображаться больше, чем 1, и только тогда, когда пользователь его рисует.

+0

Я понятия не имел об этом контроле, думаю, мне нужно кое-что изучить в WPF. Благодаря! –