它是 Winapi 的 WIC(Windows 映像组件)和 DirectX 部分吗? [关闭]

Posted

技术标签:

【中文标题】它是 Winapi 的 WIC(Windows 映像组件)和 DirectX 部分吗? [关闭]【英文标题】:Is it WIC (Windows Imaging Component) and DirectX part of the Winapi? [closed] 【发布时间】:2019-07-04 20:35:12 【问题描述】:

我不知道什么是 Winapi,什么不是。

对我来说,微软开发的任何东西都应该是 winapi,这对我来说很有意义。 但我不确定。

我必须只使用 Winapi 加载图像,这是一个家庭作业,我发现 LoadImage 是 GDI 的一部分,我知道 GDI 是 Winapi 的一部分,但它只适用于 BMP,所以有 GDI+,它似乎使用其他格式。

在我的研究中,我发现了其他方法,例如使用 DirectX,因为它更快, 或 WIC,我理解的是 COM(我猜它代表 COMponent)OLeLoadPicture 和 IShellImageDataFactory 可以帮助我加载 JPG

它们都是 Win32 的一部分吗?

我在论坛https://www.gamedev.net/forums/topic/385330-does-directx-just-wrap-the-win32-api/ 上读到 DirectX 不是 win32 的一部分,它与硬件的工作水平接近,如果 win32 已经完成工作,那么使用 Directx 将没有任何意义。 它还说DirectX包装了一些Win32功能但只是用于一些对话框和窗口处理程序,与图像处理无关,有人还说Win32使用了一些DXD9 API。 DirectX 是为 Windows 设计的,因此将其归类为 Winapi 对我来说是有意义的。

COM 组件是 Win32 的一部分吗?

我的问题是,你怎么知道什么是 Win32 api 的一部分,什么不是?

如您所见,面包屑中没有 WinApi 部分 但 WIC 也是如此

但是如果你查看 WinApi MSDN List https://docs.microsoft.com/en-us/windows/desktop/apiindex/windows-api-list 您在 API 列表中发现它还声明它被称为 Winapi 或 Win32,向下滚动,您将看到列出的 DirectX、Shell 和 COM 对象

我问这个是因为阅读不同的答案让我很困惑,基于 API 列表,我认为 DirectX、COM 和 Shell 是由 Win32 API 包装/部分的。

还因为我想使用 DirectX 来获得更好的图像处理性能,而且我不希望我的教授说类似...“哦,你没有使用 Win32 API,你将不得不重复这门课程”,因为我很确定它会发生,而且我不喜欢有人说某件事是真的,而如果它发生了,我想有足够的信心证明我仍在使用 Win32 API。

我认为目前使用 GDI+ 对我来说似乎是更安全的路径,但如果我可以使用 DirectX,我宁愿使用它。

【问题讨论】:

只有布置作业的人才能回答这个问题,因为它是主观的。 "winapi" 意义不大,也不是官方的东西。 Microsoft 提供的所有 API 都是二进制组件(主要是 .dll)。这些组件已记录在案,并且文档说明(嗯,大多数情况下)它们随附的 Windows 版本。因此,该过程是 1) 确定您想要支持的 Windows 版本,以及 2) 搜索该平台上可用的内容。 返回映像,GDI+ 适用于 Windows XP/2000 及以上版本:docs.microsoft.com/en-us/windows/desktop/api/Gdiplusinit/… WIC 适用于 Windows XP SP2 及以上版本docs.microsoft.com/en-us/windows/desktop/api/Wincodec/… Windows Shell 使用 GDI、GDI+、WIC。 COM 只是定义和使用在 Windows 中随处使用的 API 的标准方式。注意 GDI 和 GDI+ 被视为“已弃用”... 我建议winapi (Windows API) 是可通过 Windows SDK 获得的任何东西(包括 Direct2D、WIC 等)。基本上任何可以用 Visual Studio '开箱即用'编译的东西。 【参考方案1】:

您在这里得到的最佳答案可能就是回答这个问题:API 是否包含在 Windows 操作系统中,还是必须先安装才能使用它?

自 Windows XP Service Pack 2(以及相关的 Windows Server 2003 Service Pack 1)以来的每个 Windows 版本都将“DirectX”作为操作系统的一部分,尽管确切的组成“DirectX”的组件随着时间的推移而发生了变化。自 Windows Vista(以及相关的 Windows Server 2008)以来,Windows 映像组件 (WIC) 一直在操作系统中。

见Not So Direct Setup

自 Windows SDK 版本 6 以来,WIC 的标头一直在 Windows SDK 中。自 Windows SDK 版本 7 以来,Direct2D 的标头一直在 Windows SDK 中。DirectX 的所有其余部分都放入 Windows SDK 版本 8 中。

见Where is the DirectX SDK?

FWIW,GDI+ 非常古老,推荐的 API 肯定是使用 Direct2D 和 WIC。 您可以直接将它们用作 COM 接口,也可以使用包装器帮助库,如 Win2D .

至于提到的论坛问题,有很多关于内部架构的猜测。基本答案是 DirectX一直是一个系统组件,但在过去,微软通过 DirectX Runtime 将它作为一个巨大的补丁发布。事实上,这是一个非常具有侵入性的补丁,必须更新许多不同版本的操作系统。从 Windows XP SP2 开始,它只是操作系统中的另一个系统组件。

作为一个小小的历史脚注,创建 WIC 正是因为 GDI+ 在 Windows XP 的早期是一个巨大的安全问题。许多操作系统组件和 Microsoft 应用程序现在使用 WIC 进行所有位图加载,以集中模糊测试和安全服务。例如,旧的 D3DX9 帮助库包含它自己的各种位图编解码器的副本,而 D3DX10 和 D3DX11 帮助库只使用 WIC——modern replacements 也是如此。

【讨论】:

以上是关于它是 Winapi 的 WIC(Windows 映像组件)和 DirectX 部分吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用 WIC 将法线贴图保存为 16 位纹理

[原]Universal Windows问题:winapifamily问题:WINAPI_PARTITION_DESKTOP问题:WINAPI_PARTITION_APP问题:WINAPI_FAMIL

如何使用 WinAPI 和 C++ 从 Windows 系统上的服务通知客户端应用程序?

如何从 WIC 解码器确定自上而下/自下而上?

使用 WIC 从流中加载图像的结果颠倒了

使用 C++ 和 WinAPI 在 Windows 8 上获取登录用户名或电子邮件