- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们目前正在将一个较旧的应用程序转换为通过 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 中填充矩形可以消除伪影。如果您在一个位图上使用抗锯齿绘制,然后尝试在另一个位图的顶部对其进行字母混合,则可能会得到类似的效果 - 顶部的 alpha 信息被展平,然后将 ColorMatrix 中指定的新 alpha 值应用于整个图像。
如果有人能深入了解当您从图形对象中获取/释放 HDC 时到底发生了什么,以及为什么使用 GDI 绘图会直接失去 alpha,我将不胜感激。
最佳答案
支持 HDC 的位图是一个拷贝,而不是原始的,如 described here .
Using GDI on a GDI+ Graphics Object Backed by a Bitmap
When Graphics::GetHDC() is called for a Graphics object that is backedby a bitmap rather than the screen, a memory HDC is created and a newHBITMAP is created and selected into the memory HDC. This new memorybitmap is not initialized with the original bitmap's image but ratherwith a sentinel pattern, which allows GDI+ to track changes to thebitmap. Any changes that are made to the memory bitmap through the useof GDI code become apparent in changes to the sentinel pattern. WhenGraphics::ReleaseHDC() is called, those changes are copied back to theoriginal bitmap... Also, there is a performance cost to this approach becauseGDI+ must copy the changes back to the original bitmap.
很明显,当您使用 GDI 在 HDC 上绘图时,您不会获得任何抗锯齿功能。 GDI 不支持它。这就是 GDI+ 的用途。
关于c++ - GDI+ 图形对象 - 使用 GDI 直接绘制到 DC 时抗锯齿丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32885417/
尝试使用 tkinter 为一系列 PIL 图像制作动画。我的帧持续时间 (ms) 的图表如下所示: 有人知道是什么导致了这种尖尖的锯齿图案吗? 这是一个重现的脚本: from PIL import
我正在尝试使用 Canvas 创建“星爆”效果,但线段出现令人难以置信的像素化。我做错了什么吗? var rays = 40; var canvas = $("header canvas")[0];
爪牙 我在 JAGS 中有一个仅拦截逻辑模型,定义如下: model{ for(i in 1:Ny){ y[i] ~ dbern(mu[s[i]]) } for(j in 1:Ns){
我是一名优秀的程序员,十分优秀!