GDI + Graphics Obj - 使用GDI直接绘制DC时失去了抗锯齿

时间:2015-10-01 10:36:52

标签: c++ gdi+ gdi

我们目前正在通过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中填充矩形会移除伪影。 如果你在一个Bitmap上使用antialias进行绘制,然后尝试在另一个Bitmap上进行alphablend,它会产生类似的效果 - 顶部的alpha信息变平,然后在ColorMatrix中指定新的alpha值适用于整个图像。

如果有人能够提供一些有关从图形对象中获取/释放HDC时到底发生了什么的信息,以及为什么使用GDI直接删除alpha,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

支持HDC的位图是described here的副本,而不是原始位图。

  

在位图支持的GDI +图形对象上使用GDI

     

为支持的Graphics对象调用Graphics :: GetHDC()时   通过位图而不是屏幕,创建了一个内存HDC和一个新的   创建HBITMAP并将其选择到内存HDC中。这个新的记忆   位图未使用原始位图的图像进行初始化,而是使用原始位图的图像进行初始化   带有标记模式,允许GDI +跟踪变化   位图。通过使用对内存位图所做的任何更改   GDI代码的变化在哨兵模式的变化中变得明显。什么时候   调用Graphics :: ReleaseHDC(),将这些更改复制回   原始位图...此外,这种方法的性能成本是因为   GDI +必须将更改复制回原始位图。

显然,当您使用GDI绘制HDC时,您将无法获得任何抗锯齿功能。 GDI并不支持它。这就是GDI +的用途。