透明背景下原生 (c++) 和托管 (c#) GDI+ 中的不同文本抗锯齿

问题描述

我需要使用 GDI+ 在透明位图上绘制抗锯齿文本。在 C# 中,它完全按照需要工作——抗锯齿是通过 alpha 通道完成的。但是,在 C++ 中,文本与黑色背景混合,当叠加在非黑色背景上时会导致黑色边框。

Different text anti-aliasing

位图在托管代码中创建,设备上下文句柄通过 P/Invoke 传递给本机代码

var bitmap = new Bitmap(1024,768,PixelFormat.Format32bppArgb);
var g = Graphics.FromImage(bitmap);
g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
g.SmoothingMode = SmoothingMode.AntiAlias;

// c# text drawn here

var gHandle = g.GetHdc();
NativeMethods.Draw(gHandle);
g.ReleaseHdc(gHandle);

而原生的 draw 方法是这样的:

void Draw(HDC hdc)
{
  Gdiplus::Graphics g(hdc);

  g.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias);
  g.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAliasGridFit);
  
  // c++ text drawn here
}

有什么想法为什么原生渲染会以不同的方式进行,以及是否可以使其像托管渲染一样工作?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)