2013-07-10 66 views
0

我正在使用FillRectangle方法將文本(使用TextRenderer.DrawText)渲染到背景爲純白色的位圖(Color.White)上。 我然後TransparentBlt這個位圖到存儲器-DC包括彩色背景圖像,使用Color.White And &HFFFFFF作爲透明顏色的RGB值(crTransparent參數),如下所示:TransparentBlt生成非銳利圖像

TransparentBlt(hDestMemDc, 0, 0, iTextWidth, iTextHeight, hTextMemDc, 0, 0, iTextWidth, iTextHeight, Color.White.ToArgb() And &HFFFFFF) 

{I然後BitBlt組合圖像到我的控制的面,但事實並非如此相關}

而呈現的文字銳利清晰,其TransparentBlt結果是尖銳。

以下是文字的快照,呈現在白色背景(這是一個圖像,而不是鍵入的文本):

enter image description here

這是跨位圖傳輸圖像的結果上述在彩色背景:

enter image description here

請注意白色(待透明)點仍圍繞紅色文字。

此外,請注意畫在圖像左側的白色垂直線,以及在右上角繪製的類似較短的水平線。

我使用VB.NET 2005(又名VB8)。您的建議將非常感激。

+0

看起來像字體平滑。你如何渲染文本? – HerrJoebob

+0

oGraphics.CompositingQuality = Drawing.Drawing2D.CompositingQuality.HighQuality oGraphics.InterpolationMode = Drawing.Drawing2D.InterpolationMode.HighQualityBicubic oGraphics.SmoothingMode = Drawing.Drawing2D.SmoothingMode.HighQuality oGraphics.TextContrast = 0 oGraphics.TextRenderingHint = Drawing.Text .TextRenderingHint.AntiAlias – Bliss

+0

'昏暗sRect作爲矩形=新矩形(0,0,m_sTextSize.Width,m_sTextSize.Height)' '昏暗oBrush刷=新SolidBrush(const_sTextBackColor)''oGraphics.FillRectangle(oBrush,sRect) ' 'TextRenderer.DrawText(oGraphics,Me.Text,Me。字體,sRect,Me.ForeColor,const_sTextBackColor,m_eTextFormatFlags)' 如果這確實是原因,渲染的結果(上圖)如何銳利? – Bliss

回答

2

文本反鋸齒/ ClearType表示不是所有的文本都以相同的顏色呈現。文本的外部像素與它們所繪製的背景顏色混合在一起,這具有平滑邊緣的效果。因此,您無法在一種背景顏色上渲染文本,將其剪下,並期望它在另一種背景下看起來不錯。

您可以在渲染文本時禁用消除鋸齒功能,但結果也不會很好。

相反,您應該在內存中製作最終目標位圖的副本,將文本渲染到該內存上,然後再次將其重新顯示回屏幕。

+0

首先 - 感謝教育的答案。它是有義務的。我沒有提到這是一個文本滾動的應用程序。我使用blitting作爲更高效的CPU方法。如果我必須每隔20 [mSec]渲染文本一個像素,我就會失去blitting的CPU消耗優勢(我嘗試過)。有任何想法嗎? – Bliss

+0

您可以嘗試使用透明窗口(即使用'WS_EX_LAYERED'創建並使用'UpdateLayeredWindow'更新的窗口),然後直接將文本呈現給該窗口,但您仍然需要每次重新繪製文本。或者嘗試兩個分層的窗口,都是屏幕寬度 - 然後自己移動窗口以獲得滾動效果,但是我不知道在CPU使用率方面是否會更好。 –

+0

「OnPaint」事件處理函數中的文本呈現(通過在每個計時器滴答聲上調用'Refresh()間接調用)之間的(CPU使用率)性能差異和計時器內的文本呈現 - 滴答處理程序函數本身(後來也將結果呈現給控件的表面)? – Bliss