2013-07-10 32 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