2010-09-21 22 views
6

我正在使用gdiplus來「敲擊」文本。在某些情況下,我們看到圖形頂部或底部出現「尖峯」,我不確定爲什麼。我們可以通過調整筆畫寬度和字體大小來減少這種情況,但那不是一個好的解決方案。我希望有人能向我解釋這個問題。FileModeWinding和DrawPath導致出現奇怪的尖峯

Spikey Bug

和代碼示例生成此4,它的外形和穗(無意)

GraphicsPath path(FillModeWinding); 

     path.AddString(text,wcslen(text),&fontFamily,StateInfo.TheFont.TheWeight,(REAL)minSize,PointF((REAL)ptStart.x, (REAL)ptStart.y),&sf); 
     // Draw the outline first 
     if (StateInfo.StrokeWidth > 0) { 
     Gdiplus::Color strokecolor(GetRValue(StateInfo.StrokeColor), GetGValue(StateInfo.StrokeColor), GetBValue(StateInfo.StrokeColor)); 
     Pen pen(strokecolor,(REAL)StateInfo.StrokeWidth);  
     graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias); 
     graphics.SetPixelOffsetMode(Gdiplus::PixelOffsetModeHighQuality); 
     graphics.DrawPath(&pen, &path); 
     } 
     // Draw the text by filling the path   
     graphics.FillPath(&solidBrush, &path); 
+1

我確信4號頂部的Spike是因爲四個內部形狀相似的區域。 fillmodewinding的文檔似乎指向這一點。我也嘗試過FillModeAlternate,沒有任何改變。我不知道如何從這個問題中恢復。有什麼建議麼? – reuscam 2010-09-23 19:54:53

+0

我懷疑填充模式是問題。你有沒有試過在具有不同視頻驅動程序的機器上運行它? – 2010-10-02 16:33:49

+0

是的,我有同樣的問題。以上字體是Impact。在相同的字體大小和筆劃寬度下,Arial不會出現問題。 – reuscam 2010-10-04 12:48:55

回答

3

我同意填充模式不是問題,我覺得這只是用於繪製輪廓的筆寬。對於帶有尖角的封閉空間的字符(如4和'A'),由於用於繪製輪廓的筆寬變大,所以內部形狀(四個小三角形)的大小也變得更大。

最終,內部形狀會變得太大而不能被外部形狀所包含,並且會開始戳穿,導致您看到的人造物。

下面是輪廓寬度變大時固定字體大小(再次使用Impact字體)的說明。沒有填寫在這裏,只是爲了graphics.DrawPath(通話):

alt text

的填充操作並不關心輪廓寬度,並使用字母的原始形狀。

這部分掩蓋了一些凌亂的問題。下面是用填充打開:類似

alt text

的事情會以字符 'A' 發生:

alt text alt text

編輯:調用SetLineJoin,如其他答覆中指出,是阻止這種情況發生的方法。

+0

+1用於清楚地說明原因。這就像使用巨大的筆畫出東西。有時筆可以比你畫的更大。 – 2010-10-07 10:45:32