WritableBitmap을 사용하여 "부드러운"선을 렌더링해야합니다. 저는 WritableBitmapExtenstions을 사용하고 있습니다.WPF - WritablebitmapEx 부드러운 선을 표현하십시오.
12ms마다 화면 중앙에 표준화 된 (X, Y) 12 점이 생기고 X는 이미지 표면 (비트 맵)의 픽셀을 나타냅니다.
초기화 :
_wb = new WriteableBitmap((int)mainGrid.ActualWidth, (int)mainGrid.ActualHeight, 96.0, 96.0, PixelFormats.Pbgra32, null);
image.Source = _wb;
CompositionTarget.Rendering += new EventHandler(CompositionTarget_Rendering);
CompositionTarget_Rendering :
Point [] points = null;
if (blocks.TryDequeue(out points)) // blocks is a ConcurrentQueue which gets enqueued on a timer interval on another thread.
{
using (_wb.GetBitmapContext())
{
Draw(points);
}
}
그리기 :
private void Draw(Point[] points)
{
int x1, y1, x2, y2;
if (lastX != 0 && lastY != 0)
{ // Draw connection to last line segment.
x1 = lastX;
y1 = lastY;
x2 = (int)points[0].X;
y2 = (int)points[0].Y;
_wb.DrawLine(x1, y1, x2, y2, Colors.Red);
}
for (int i = 0; i < points.Count() - 1; i++)
{// draw lines. [0],[0] - [1],[1] ; [1],[1] - [2],[2] .....and so on.
x1 = (int)points[i].X;
y1 = (int)points[i].Y;
x2 = (int)points[i + 1].X;
y2 = (int)points[i + 1].Y;
_wb.DrawLine(x1, y1, x2, y2, Colors.Red);
}
lastX = (int)points[points.Count() - 1].X;
lastY = (int)points[points.Count() - 1].Y;
}
결과 :
글자가 정확하게 그려져 있지만 그려지는 방식이 매끄럽지 않습니다. Writablebitmap을 사용하고 Rendering 이벤트의 모든 선을 그렸습니다. 각 부분은 여전히 일괄 처리로 렌더링되었습니다.
이렇게 부드럽게하기 위해 한 번에 하나의 픽셀을 그려야한다고 결론 지을 수 있습니까? WritablebitmapEx 곡선은 "WriteableBitmapExCurveSample.Wpf" 라는 이름의 프로젝트를 샘플로 당신이 보면
당신은 내가 달성하기 위해 wan't 부드러움의 종류를 볼 수 있습니다 (이것은 위의 링크에서 샘플을 다운로드 할 필요합니다).
일반 gdi +를 베 지어 또는 이와 유사한 형태로 사용하지 않는 이유는 무엇입니까? –
나는 시도 할 수 있지만 내가 알고있는 것을 사용하고 winforms로 돌아 가지 않기를 바랬다 –
[DrawCurve] (http://floris.briolas.nl/floris/2009/)에 도움이 될 간단한 해결책을 찾지 못하면 04/addcurve-for-wpf-cardinal-spline /) –