2014-02-20 3 views
3

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

결과 :

enter image description here

글자가 정확하게 그려져 있지만 그려지는 방식이 매끄럽지 않습니다. Writablebitmap을 사용하고 Rendering 이벤트의 모든 선을 그렸습니다. 각 부분은 여전히 ​​일괄 처리로 렌더링되었습니다.

이렇게 부드럽게하기 위해 한 번에 하나의 픽셀을 그려야한다고 결론 지을 수 있습니까? WritablebitmapEx 곡선은 "WriteableBitmapExCurveSample.Wpf" 라는 이름의 프로젝트를 샘플로 당신이 보면

당신은 내가 달성하기 위해 wan't 부드러움의 종류를 볼 수 있습니다 (이것은 위의 링크에서 샘플을 다운로드 할 필요합니다).

+0

일반 gdi +를 베 지어 또는 이와 유사한 형태로 사용하지 않는 이유는 무엇입니까? –

+0

나는 시도 할 수 있지만 내가 알고있는 것을 사용하고 winforms로 돌아 가지 않기를 바랬다 –

+2

[DrawCurve] (http://floris.briolas.nl/floris/2009/)에 도움이 될 간단한 해결책을 찾지 못하면 04/addcurve-for-wpf-cardinal-spline /) –

답변

2

DrawLine 대신 DrawLineAa (Aa == 앤티 앨리 어스) 확장 방법을 사용해보십시오.

+0

더 좋아 보이지만 렌더링은 정확히 같습니다. +1 노력. –

+0

@eranotzap 귀하의 의견은 모순입니다. 보기가 더 좋으면 렌더링이 동일하지 않을 수 있습니다.DrawLinaA를 사용하여 질문을 명확히하거나 업데이트 할 수 있습니까? –

+0

렌더링을 의미하는 것은 그것이 그려지는 "부드러움"입니다. 세그먼트를 깜박이는 것처럼 보입니다. 나는 그림을 연필로 그리는 것처럼 픽셀 단위로 그린 것처럼 보이지 않습니다. , 나는 그것이 화면에 표현되는 방식을 그리는 것을 신경 쓰지 않습니다. (여기의 모든 몸체는 선의 매끄러움에 대해 말하고 있습니다). –

2

가장 적절한 결과를 얻으려면 포스트 FX 매트릭스 필터를 적용 할 수 있습니다. http://lodev.org/cgtutor/filtering.html

잘 asp.net 함께 구현하는 방법을 기억하지 않지만 거기에 뭔가 CompositionTarget 비슷한 생각합니다.

관련 문제