TransparentBlt生成非锐利图像

时间:2013-07-10 20:25:09

标签: .net winapi transparency bitblt bitblit

我使用TextRenderer.DrawText方法将文本(使用Color.White)渲染到背景色为纯白色(FillRectangle)的位图上。 我然后TransparentBlt将此位图放到包含彩色背景图片的内存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结果 NOT 清晰。

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

enter image description here

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

enter image description here

请注意白色(待透明)点仍围绕红色文字。

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

我正在使用VB.NET 2005(a.k.a VB8)。非常感谢您的建议。

1 个答案:

答案 0 :(得分:2)

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

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

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