2011-08-29 89 views
7

我正在繪製一個路徑到CGContext,遵循從用戶收集的一組點。似乎有一些隨機輸入抖動會導致一些線邊緣看起來鋸齒狀。我認爲有一點輕鬆會解決這個問題。如果我使用的是OpenGL ES,我會簡單地將羽毛應用到我正在撫摸路徑的精靈上;然而,這個項目需要我留在Quartz/CoreGraphics中,我似乎無法找到類似的解決方案。iOS Quartz/CoreGraphics繪製羽毛筆畫

我已經嘗試繪製5條線,每條線略大一些,透明度接近羽毛。這會產生不好的結果,並會顯着降低性能。

這是線描代碼:

CGContextMoveToPoint(UIGraphicsGetCurrentContext(),((int)lastPostionDrawing1.x), (((int)lastPostionDrawing1.y))); 
CGContextAddCurveToPoint(UIGraphicsGetCurrentContext(), ctrl1_x, ctrl1_y, ctrl2_x, ctrl2_y, lastPostionDrawing2.x, lastPostionDrawing2.y; 
[currentPath addCurveToPoint:CGPointMake(lastPostionDrawing2.x-((int)furthestLeft.x)+((int)penSize), lastPostionDrawing2.y controlPoint1:CGPointMake(ctrl1_x, ctrl1_y) controlPoint2:CGPointMake(ctrl2_x, ctrl2_y)]; 
+0

你有沒有試過CGContextSetShouldAntialias函數? – Davyd

+0

在過去,我有類似的問題使用四條曲線或2個控制點的曲線。如果你發給我你想繪製的.svg或者至少是你想要繪製的羽毛的更多信息,我可以幫忙 – GianPac

回答

2

我要繼續前進,假設你的CGContext上仍具有抗鋸齒開啓,但如果沒有,那麼這是明顯的先想嘗試,正如@ Davyd的評論所暗示的那樣:CGContextSetShouldAntialias是感興趣的功能。

假設這不是問題,並且該行正被上下文反鋸齒化,但是您仍然希望某個東西「更柔和」。我可以想出幾種方法來做到這一點,希望能比5次更快地做到這一點。

首先,您可以嘗試使用CGContextReplacePathWithStrokedPath獲取描邊路徑(即描述當前路徑的描邊輪廓的路徑),然後可以使用漸變填充此路徑(或任何其他填充技術可提供所需結果)這對於直線很好,但對於曲線路徑不會很直接(因爲梯度正在填充描邊路徑的區域,並且將是線性或徑向的)。

另一個可能不太明顯的選項,可能是爲了這個目的濫用CG的陰影畫。您要查找的功能是:CGContextSetShadowWithColor這裏的方法:

  • 保存GState:CGContextSaveGState
  • 獲取原始路徑
  • 複製路徑的邊框,2.0從自身翻譯它拿走* bbox.width使用CGPathCreateCopyByTransformingPath(注:僅使用X方向,這樣你就不需要擔心翻轉的情況下)
  • 剪輯的背景下使用CGContextClipToRect
  • 坐落在一個陰影原BBOX上下文無線th CGContextSetShadowWithColor
    • 一些最小的模糊(從0.5開始並從那裏開始。模糊參數是非線性的,IME它是一種猜測和檢查操作)
    • 偏移量等於-2.0 * bbox寬度和0.0高度,縮放到基本空間。 (注意:這些偏移量位於基本空間中,這會讓人發瘋,但假設你沒有添加自己的縮放變換,縮放因子將爲1.0或2.0,所以實際上,您將設置一個offset.width爲-2.0 * bbox.width或-4.0 * bbox.width)
    • 您選擇的顏色。
  • 描邊翻譯後的路徑。
  • 彈出GState CGContextRestoreGState

這應該離開你「只是」影子,你可以希望調整來實現你想要的結果。所有這一切說,CG的陰影繪製性能是IME,並不是完全可怕的,並不是完全確定性的。我希望它比用5種不同的筆畫撫摸5次路徑要快,但絕不是如此。

它會降低多少實現這種效果值得你。