-2

语境

自 Windows 10 版本 2004 更新以来,放大镜 windows 应用程序已更新。与每次更新一样,它也存在一些问题。

由于这些问题可能需要很长时间才能解决,所以我决定实现我自己的小项目全屏放大镜。

我一直在使用 windows magnification.dll 中的放大 API 在 c#、.Net 4.6 中进行开发。一切顺利,主要功能现已实现。但是缺少一件事,像素化内容的平滑模式... Windows 放大镜对放大的内容实现了抗锯齿/平滑。

我检查了放大 API,似乎没有提供该选项。

如何在 Windows 放大 API 上为放大镜添加平滑模式?

我知道像素平滑方法,但不熟悉 win32 API 以知道在屏幕刷新之前将平滑方法挂钩到哪里。

编辑:

感谢@IInspectable 的回答,经过小小的搜索,我在一个python 项目中找到了对放大API 的调用。

基于此,我在我的 C# 应用程序中编写了这个片段,它按预期工作!

[DllImport("Magnification.dll")]
private static extern bool MagSetFullscreenUseBitmapSmoothing(bool useSmoothing);

...

var isMagnifierInitialized = MagInitialize();
var isSmoothingActive = MagSetFullscreenUseBitmapSmoothing(true);
4

1 回答 1

0

放大 API中没有允许客户端应用过滤(颜色转换除外)的公共接口。这曾经是可能的,但MagSetImageScalingCallback API 在 Windows 7 中已被弃用:

此功能仅在桌面窗口管理器(DWM) 关闭时有效。

即使它仍然可用,它也将不再按设计工作。从桌面窗口管理器始终打开

在 Windows 8 中,桌面窗口管理器 (DWM) 始终处于打开状态,最终用户和应用程序无法禁用。

这样一来,您在尝试使用 Magnification API 复制 Magnifier 应用程序的升频器的结果时就非常不走运了。


放大镜应用程序似乎正在使用未记录的 API 调用来实现放大效果。Runningdumpbin /IMPORTS magnify.exe | findstr "Mag"列出了一些公共 API,以及以下内容:

  • MagSetLensUseBitmapSmoothing
  • MagSetFullscreenUseBitmapSmoothing

除非您愿意对这些 API 调用进行逆向工程,否则您将不得不将时间花在另一个项目上,或者寻找不同的解决方案。


关于放大算法的注意事项:如果仔细观察,您会注意到放大后的图像不会出现任何与平滑算法相关的伪影。

放大图像

图像不会以任何方式模糊。相反,它到处都显示出锋利的边缘。我不知道这里有什么升级算法。维基百科关于像素艺术缩放算法的条目列出了一些具有非常相似的属性。它很可能是其中之一,或其修改版本。

于 2021-06-15T16:45:36.490 回答