0

我正在使用该方法将文本(使用TextRenderer.DrawText)渲染到一个位图上,该位图是背景色纯白色(Color.WhiteFillRectangle。然后我将TransparentBlt这个 Bitmap 放到一个包含彩色背景图片的内存 DC 上,使用Color.White And &HFFFFFF透明颜色的 RGB 值(crTransparent参数),如下所示:

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

{然后我BitBlt将组合图像放到我的控件表面上,但这不是那么相关}

尽管呈现的文本清晰清晰,但其TransparentBlt结果并不清晰。

这是文本的快照,呈现在白色背景上(这是图像而不是键入的文本):

在此处输入图像描述

这是在彩色背景上对上面的图像进行 Trans-Blitting 的结果:

在此处输入图像描述

请注意,白色(透明)点仍在红色文本周围。

此外,请注意在图像左侧绘制的白色垂直线,以及在右上角绘制的类似较短的水平线。

我正在使用 VB.NET 2005(又名 VB8)。您的建议将不胜感激。

4

1 回答 1

2

文本抗锯齿 / ClearType 意味着并非所有文本都以相同的颜色呈现。文本的外部像素与绘制它们的背景颜色混合,具有平滑边缘的效果。因此,您不能在一种背景颜色上渲染文本,将其剪掉,并期望它在另一种背景下看起来一样好。

您可以在渲染文本时禁用抗锯齿,但结果看起来也不会那么好。

相反,您应该在内存中制作最终目标位图的副本,在其上渲染文本,然后再次将其复制回屏幕。

于 2013-07-10T20:32:04.200 回答