【发布时间】:2015-12-29 09:07:15
【问题描述】:
我们目前正在将旧应用程序转换为通过 GDI+ 进行绘图,而不是直接使用 GDI。随着我们逐步翻译系统,有时我们需要从 Gdiplus::Graphics 对象中获取 HDC,以便允许尚未翻译的代码使用 GDI 直接绘制到它。
绘图进行得很好,只是我们似乎在使用 GDI 直接绘制到 DC 的图像上丢失了抗锯齿。如果从 Graphics 对象中获取 DC 后,我们在整个区域上绘制一个填充的矩形,然后继续绘制,结果很好。如果我们直接绘制所有内容,则无需抗锯齿。
void Draw(Gdiplus::Graphics& renderContext)
{
auto hdc = renderContext.GetHDC();
auto dc = HDC::FromHandle(nativeDC);
//Required to antialias drawing below
dc->FillSolidRect(GetClientRect(), RGB(255, 255, 255));
/* Do Drawing */
dc ->Detach();
renderContext.ReleaseHDC(hdc );
}
更准确地说,抗锯齿 alpha 似乎被展平了,这解释了为什么在绘制之前在 GDI 中填充一个矩形会消除伪影。 如果您在一个位图上绘制抗锯齿,然后尝试在另一个位图上进行 alphablend 混合,您可能会得到类似的效果 - 顶部的 alpha 信息被展平,然后在 ColorMatrix 中指定的新 alpha 值应用于整个图像。
如果有人能提供一些见解,了解当您从图形对象中获取/释放 HDC 时究竟发生了什么,以及为什么使用 GDI 绘图会直接丢失 alpha,我将不胜感激。
【问题讨论】:
-
图像没有抗锯齿。如果图像包含透明像素(alpha