如何使用 Win32/GDI 加载 PNG 图像(如果可能的话,没有 GDI+)?
是否可以使用 Win32 GDI 函数将 PNG 从文件加载到 HBITMAP 中?如果没有,在不使用外部库(如 libpng)的情况下最轻的解决方案是什么?
Is it possible to load a PNG from a file into an HBITMAP using Win32 GDI functions? If not, what would be the lightest solution without using external libraries (like libpng)?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您可以使用 Windows 成像组件 加载 PNG 文件(在 Windows XP SP2 及更高版本上)。请参阅 MSDN 杂志(原文位于 网络存档 - 格式更好一点)了解如何使用 API 和 我的博客文章提供了从 IStream 加载 PNG 并将其转换为 HBITMAP 的代码示例。
You can use the Windows Imaging Component to load PNG files (on Windows XP SP2 and later). See MSDN Magazine (original in web archive - a bit better formatting) for an introduction on how to use the API and my blog post for a code sample that loads a PNG from an IStream and converts it to an HBITMAP.
无需使用 Windows Imaging Component、GDI+ 或 PNG 库。您可以使用图标功能。
将新图标(ICO_PNG)添加到具有自定义宽度和高度的VC项目资源中(资源编辑器->图像->新图像类型)。将您的 png 图片复制到此处,然后使用填充工具+透明色使图标透明。
将优化校准 (IDC_PNG) 添加到您的对话框(类型 = 所有者绘制)。
对话框程序代码:
There is no need to use Windows Imaging Component, GDI+ or PNG library. You can use Icon functionality.
Add new icon (ICO_PNG) to VC project resources with custom Width and Height (Resource Editor->Image->New Image Type). Copy Your png image here and use Fill Tool+transparent color to make icon transparent.
Add Picture Control (IDC_PNG) to Your dialog (Type = Owner draw).
Dialog procedure code:
您可以使用
StretchDIBits
API 来完成此操作,但受到操作系统/驱动程序可用性的限制。有关详细信息,请参阅 MSDN 文档:
http://msdn。 microsoft.com/en-us/library/dd145121(v=VS.85).aspx
http://msdn.microsoft.com/en-us/library/dd145107(VS.85).aspx
对于误导对此问题感兴趣的各位,我深表歉意。
让我纠正我的错误。
PNG 绘图没有
StretchDIBits
。您最好尝试 WIC 方法或考虑将 GDI+ 集成到您的项目中。
You can do it with
StretchDIBits
API, but limited by OS/driver availability.Consult MSDN documentation for details:
http://msdn.microsoft.com/en-us/library/dd145121(v=VS.85).aspx
http://msdn.microsoft.com/en-us/library/dd145107(VS.85).aspx
I sincerely apologize for misleading you guys interested in this issue.
Let me correct my mistake.
No
StretchDIBits
for PNG drawing.You'd better try WIC method or consider way to integrate GDI+ in your projects.
我们可以通过GDI显示png图像,在创建窗口时通过以下两个步骤(在窗口过程函数中的情况下
WM_CREATE
):buffer
CreateBitmap()
函数中使用buffer
创建HBITMAP
实例这是可运行的代码,它是纯的C和
main()
作为入口点函数(libpng和zlib来自我自己的opencv编译)参考:https://www.cnblogs.com/mr-wid/archive/2013/04/22/3034840.html
We can display png image via GDI, by the following two steps when creating your window(case
WM_CREATE
in window procedure function):buffer
HBITMAP
instance usingbuffer
inCreateBitmap()
functionHere's the runnable code, which is in pure C and
main()
as entry point function (libpng and zlib are from my own opencv compilation)Reference: https://www.cnblogs.com/mr-wid/archive/2013/04/22/3034840.html
vladimir_hr 的答案很简单。
遵循简单的步骤。
在资源头文件中声明如下:
#define IDI_PNG 1000
资源文件*.rc中有:
IDI_PNG ICON "protractor.ico"
图标文件。
使用支持自定义大小而不是标准 Windows 图标大小的图标编辑器将您的(透明)png 文件转换为图标文件,将此 png 图像保存为图标图像。
其余的只是在 DC 之间传输。
The answer by vladimir_hr is simplicity itself.
Simple steps to follow.
In the resources header file declare like:
#define IDI_PNG 1000
In the resource file *.rc have:
IDI_PNG ICON "protractor.ico"
The icon file.
Convert your (transparent) png file into an icon file by using an icon editor that support custom size instead of the standard Windows' icon sizes, save this png image as an icon image.
The rest is just blitting between DC's.