我可以使用WinApi LoadImage加载嵌入的图像资源吗?

时间:2016-12-24 08:17:35

标签: vb.net winapi pinvoke

我需要在项目中使用LoadImage pinvoke。我需要使用它,以便我得到一个透明的BMP。以下代码工作正常,但需要一个路径。

Dim hbitmap As IntPtr = NativeMethodsEX.LoadImage(Nothing, "C:\Users\username\Desktop\mickey32.bmp", NativeMethodsEX.IMAGE_BITMAP, 0, 0, NativeMethodsEX.LR_LOADFROMFILE Or NativeMethodsEX.LR_CREATEDIBSECTION)

我的问题是我可以做同样的事情,但是我的项目中嵌入了一个文件吗?或者是在某个阶段我将文件复制到文件系统以便在LoadImage方法中使用的唯一方法。

编辑:我想避免的是在文件系统中有一个图像文件,例如可以被用户删除。

编辑 - 我在做什么?inserting a menu item into an existing windows hmenu as I indicate in this question of mine.。我想添加一个透明背景的图像。

编辑 - 为什么我不使用.net来获取我的图像?

本论坛中的文档很好,以下内容不起作用。此外,我无法让它发挥作用。

Dim bm As Bitmap = My.Resources.mickey32.bmp
Dim hbitmap As IntPtr = nbm.GetHbitmap

在这个问题下面的评论之后,为什么我不使用.NET,我甚至尝试过以下suggestions which included a format.。仍然没有运气。

Dim bm As Bitmap = My.Resources.mickey32.bmp
Dim bm1 As Bitmap = New Bitmap(bm)
Dim nbm As Bitmap = bm1.Clone(New Rectangle(0, 0, bm1.Width, bm1.Height), Imaging.PixelFormat.Format32bppArgb)
Dim hbitmap As IntPtr = nbm.GetHbitmap

使用PNG进行编辑

此代码使用PNG文件。它加载正常但透明背景变白。

Dim bm As Bitmap = My.Resources.mickey32.png
Dim hbitmap As IntPtr = bm.GetHbitmap

我的解决方案或我最后做了什么

我的主要问题是获得具有透明背景的图像。我认为唯一的方法是使用带有位图图像的LoadImage API。感谢下面的广泛评论,我再次尝试使用.net方法和一个png文件(我错误地认为这不起作用)。我then found this forum question.解决方案是使用它;

hbitmap = bm.GetHbitmap(Color.Black)

现在我正确地显示了它。

在我的搜索中,我还发现this forum answer as well.接受的答案说;

  

在与GDI(和Win32)进行互操作时,GDI +存在许多与alpha混合相关的问题。在这种情况下,对bmp.GetHbitmap()的调用会将您的图像与黑色背景混合。

我没有测试代码,但至少看起来它也可能是我的解决方案。

0 个答案:

没有答案