Visual studio 2010 VS2010资源文件中的PNG图像在使用GDI的XP上做奇怪的事情+

Visual studio 2010 VS2010资源文件中的PNG图像在使用GDI的XP上做奇怪的事情+,visual-studio-2010,mfc,resources,png,gdi+,Visual Studio 2010,Mfc,Resources,Png,Gdi+,我在VS2010项目中使用了几个32位PNG文件,使用LoadResource/LockResource等将它们加载到GDI+位图中,并从IStream创建。在我的Win7开发机器上,一切都很顺利 然而,我正在使用SetColorMatrix/ImageAttributes进行一些颜色和alpha掩蔽,这在Win7上运行得很好,但是当我在XP上运行它并使用ImageAttributes参数调用Bitmap::DrawImage时,PNG根本没有被绘制出来。在任何时候都没有任何错误提示问题,只是不

我在VS2010项目中使用了几个32位PNG文件,使用LoadResource/LockResource等将它们加载到GDI+位图中,并从IStream创建。在我的Win7开发机器上,一切都很顺利

然而,我正在使用SetColorMatrix/ImageAttributes进行一些颜色和alpha掩蔽,这在Win7上运行得很好,但是当我在XP上运行它并使用ImageAttributes参数调用Bitmap::DrawImage时,PNG根本没有被绘制出来。在任何时候都没有任何错误提示问题,只是不可见而已

如果我使用直接从文件而不是从资源加载的图像运行相同的代码,它在XP和Win7上可以正常工作,但我真的不想在我的安装程序中捆绑PNG文件-这看起来有点像一个预兆。为了让生活更加精彩,我的XP机器太慢了,甚至没有考虑运行VS2010

有没有人知道是什么原因导致了这个问题,或者有没有人提出了一些建议来追踪这个问题,因为我已经花了很长时间在这个问题上,我已经没有灵感了

提前谢谢

更新:

在进行了更多的负载测试之后,我还没有完全弄清这一点,但有强有力的证据表明,使用BitmapIStream*构造函数在某种程度上破坏了PNG上的alpha通道的透明度。我还没有弄清楚到底发生了什么,但我找到了一个解决方案——我现在使用FreeImage从资源文件加载PNG,然后从FIBITMAP中的原始图像数据创建位图对象。这是完美的工作,所以证据表明位图构造函数存在问题

更新2:


我创建的使用FreeImage从参考资料中加载PNG文件的类非常有用,因此为了方便起见,我决定使用它加载所有图像,但加载标准BMP文件时遇到问题。经过一点调查,似乎当您将BMP文件作为位图资源包含时,BMP文件的前14个字节在存储到资源包中之前会被剥离,这使得加载它们的其他任何操作都很困难。无论如何,它很容易解决-我只是将位图资源的资源类型更改为BMP,所以它基本上将其视为未知类型并存储整个文件。所以现在一切都按计划进行了。我想我会发布这段经历,如果其他人尝试做同样的事情,我希望能节省他们一个小时。

放一堆跟踪语句并在XP上运行,肯定有一些错误代码返回。尽量不要使用MFC包装类并调用原始的基础win32 API。我曾与CImage和朋友有过不愉快的经历;我要做的是将png转换为32位位图bmp,使用::LoadImage加载这些位图,并使用::AlphaBlt绘制它们


另外,尝试使用不带透明度的png-我遇到的所有问题都是带有每像素透明度的图像。如果这样做有效的话,你至少知道应该从哪个方向开始寻找。

所以我自己最终找到了答案,只是更新了这个,这样我就可以将它标记为已回答


在某些情况下,似乎存在与GDI+和PNG透明度相关的某种缺陷。我使用FreeImage加载PNG解决了这个问题,但这导致了BMP的另一个问题。看起来VS中的位图资源被剥离了14个字节,这可能是因为如果您已经告诉VS这是一个位图,那么这是冗余信息。如果使用LoadImage或任何标准WinAPI函数加载资源,这通常是正常的,但是如果使用另一个库,就像我使用FreeImage一样,然后,在尝试使用LoadResource加载资源之前,您需要将资源类型更改为图像或非位图。

感谢Roel的建议-我已经找到了一个解决方案,请参见上文,我的直觉是,我使用的BitmapIStream*构造函数中有一些不正确的东西正在破坏alpha通道。不幸的是,我别无选择,只能透明地使用PNG——这是我开始使用PNG的原因之一。