如何使用LoadImage和StretchDIBits绘制PNG图像?

时间:2010-12-31 04:22:59

标签: c++ image png gdi stretchdibits

(这与How would I load a PNG image using Win32/GDI (no GDI+ if possible)?上的问题有关。)

大家好,

我很想知道,因为你有一个PNG资源嵌入了一个标识为IDB_PNG1的二进制文件中,并且有一个LPDRAWITEMSTRUCT来绘制(这意味着你拥有HDC以及目标的矩形),如何使用StretchDIBits将该图像绘制到屏幕上?我以前曾与BitBltTransparentBlt合作,但StretchDIBits似乎工作方式不同,LoadImage似乎与PNG无关。

谢谢!

(注意:我说的语言是C ++,但这不太重要...... C,C#,Visual Basic等都没关系;我只是想弄清楚步骤,而不是确切的代码需要。)

2 个答案:

答案 0 :(得分:9)

我写了一个blog post(在显示带有C ++的初始屏幕上),其中包含一个完整的代码示例,它从资源加载PNG并将其转换为HBITMAP(使用WIC)。然后,您可以使用CreateCompatibleDC,SelectObject和BitBlt将其显示在目标HDC中。

虽然我还没有尝试过,但是如果你将资源中的原始字节加载到内存中,你应该可以使用StretchDIBits直接显示PNG,并设置一个宽度,高度等的BITMAPINFOHEADER结构。如MSDN sample中所示。

C#和VB.NET解决方案将完全不同,因为您可以使用System.Drawing(GDI +的包装)或System.Windows.Media.Imaging(在WPF应用程序中)来处理图像加载和绘图。

答案 1 :(得分:1)

我认为位图内的PNG支持仅供打印机驱动程序使用。对于屏幕显示,您可能需要使用某些代码(例如libpng)自行解压缩PNG数据。