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

时间:2011-06-29 16:10:10

标签: visual-studio-2010 mfc resources png gdi+

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

但是,我正在使用SetColorMatrix / ImageAttributes进行一些颜色和alpha遮罩,它在Win7上工作正常,但是当我在XP上运行并使用ImageAttributes参数调用Bitmap :: DrawImage时,根本不绘制PNG 。在任何时候似乎都没有任何错误表明存在问题,它只是不可见。

如果我使用直接从文件而不是从资源加载的图像运行相同的代码,它在XP和Win7上运行正常,但我真的不想在我的安装程序中捆绑PNG文件 - 它似乎有点像一个小屋。为了让生活变得更加刺激,我的XP机器太慢了,甚至无法考虑运行VS2010!

有没有人有任何想法可能会导致这种情况,或建议跟踪问题,因为我花了很长时间在这上面,我没有灵感。

提前致谢。

更新:

在加载更多测试之后,我还没有完全了解这一点,但是有强有力的证据表明使用Bitmap(IStream *)构造函数以某种方式在PNG上以透明方式修改alpha通道。我还没弄清楚到底发生了什么,但我找到了一个解决方案 - 我现在使用FreeImage从资源文件加载PNG,然后从FIBITMAP中的原始图像数据创建Bitmap对象。这是完美的,因此证据表明该Bitmap构造函数存在问题。

更新2:

我创建的使用FreeImage从资源加载PNG文件的类很有用,为了方便起见,我决定使用它加载我的所有图像但是加载标准BMP文件时遇到了问题。经过一些调查后,似乎当您将BMP文件包含为BITMAP资源时,BMP文件的前14个字节在它们存储在资源包之前被剥离,这使得加载它们的任何其他内容变得棘手。无论如何,它很容易解决 - 我只是将“BITMAP”资源的资源类型更改为“BMP”,因此它基本上将其视为未知类型并存储整个文件。所以现在它们都按预期工作了。只是想我会发布经验,如果他们试图做同样的事情,希望能在一个小时内拯救别人。

2 个答案:

答案 0 :(得分:0)

放一堆跟踪语句并在XP上运行,必须在某处返回一些错误代码。尝试不使用MFC包装类并调用原始底层win32 API。我与CImage和朋友有过不愉快的经历;我所做的是将png转换为32位位图(bmp),加载:: LoadImage()并使用:: AlphaBlt()绘制它们。

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

答案 1 :(得分:0)

所以我最终找到了答案(只是更新这个,以便我可以将其标记为已回答)。

在某些情况下,似乎存在某种与GDI +相关的错误以及PNG中的透明度。我使用FreeImage来加载PNG,但这导致了BMP的另一个问题。似乎VS中的BITMAP资源从它们中剥离了14个字节,大概是因为这是冗余信息,如果你已经告诉VS它是一个位图。如果您随后使用LoadImage()或任何标准WinAPI函数加载资源,这通常很好,但如果您使用另一个库(就像我使用FreeImage),那么您需要将资源类型更改为IMAGE(或者不是BITMAP的东西) )在尝试使用LoadResource加载它之前。