Tag: cleartype

禁用特定GDI设备上下文的抗锯齿

我正在使用第三方库将图像渲染到GDI DC,我需要确保在没有任何平滑/抗锯齿的情况下渲染任何文本,以便我可以将图像转换为具有索引颜色的预定义调色板。 我用于渲染的第三方库不支持这个,只是根据字体渲染的当前窗口设置呈现文本。 他们还表示他们不太可能在短时间内添加切换抗锯齿function。 到目前为止,我发现的最好的工作是以这种方式调用第三方库(为简洁起见,error handling和先前的设置检查被省略): private static void SetFontSmoothing(bool enabled) { int pv = 0; SystemParametersInfo(Spi.SetFontSmoothing, enabled ? 1 : 0, ref pv, Spif.None); } // snip Graphics graphics = Graphics.FromImage(bitmap) IntPtr deviceContext = graphics.GetHdc(); SetFontSmoothing(false); thirdPartyComponent.Render(deviceContext); SetFontSmoothing(true); 这显然会对操作系统产生可怕的影响,其他应用程序会在每次渲染图像时从禁用类型闪烁到禁用和返回。 所以问题是,有谁知道如何改变特定DC的字体渲染设置? 即使我可以只更改进程或线程而不是影响整个操作系统,这将是向前迈出的一大步! (这样我就可以选择将这个渲染转换为一个单独的进程 – 无论如何都会在渲染后将结果写入磁盘) 编辑:我想补充一点,我不介意解决方案是否比一些API调用更复杂。 我甚至会对一个解决方案感到满意,如果只需要一天的工作就可以挂钩系统dll。 编辑:背景信息第三方库使用约70种颜色的调色板进行渲染。 在将图像(实际上是地图图块)渲染到DC之后,我将每个像素从其32位颜色转换回其调色板索引,并将结果存储为8bpp灰度图像。 这将作为纹理上传到video卡。 在渲染过程中,我重新应用调色板(也存储为纹理),并在video卡上执行像素着色器。 这允许我瞬间在不同的调色板之间切换和淡入淡出,而不需要重新生成所有需要的切片。 生成并上传所有瓷砖需要10-60秒才能获得典型的世界观。 编辑:将GraphicsDevice重命名为Graphics这个问题的上一个版本中的GraphicsDevice类实际上是System.Drawing.Graphics。 我已经重命名它(使用GraphicsDevice […]