2011-06-29 31 views
1

我用我的VS2010項目數32位PNG文件,並將它們加載到GDI +位圖。所有工作都很好,在我的Win7開發機器上很漂亮。我使用SetColorMatrix/ImageAttributes在Win7上正常工作,但是當我在XP上運行它並使用ImageAttributes參數調用Bitmap :: DrawImage時,並不是在繪製PNG時使用了SetColorMatrix/ImageAttributes,而是使用SetColorMatrix/ImageAttributes所有。在任何時候,似乎都沒有任何錯誤來表明問題,它只是不可見。PNG圖像在VS2010資源文件在XP上做奇怪的事情與GDI +

如果我用直接從文件而不是從資源加載的圖像運行相同的代碼,它可以在XP和Win7上正常工作,但我並不想將PNG文件捆綁到我的安裝程序中 - 似乎有點的一個bodge。爲了讓生活變得更加激動人心,我的XP機器速度太慢,甚至無法運行VS2010!

有沒有人有任何想法可能是導致此,或建議,以跟蹤這個問題了,因爲我花了很長一段時間就這個問題和我出的靈感。

在此先感謝。

更新:

負載更多的測試後,我還沒有完全得到了這條底線,但有強有力的證據表明,使用位圖(的IStream *)構造函數以某種方式重整上的PNG alpha通道具有透明度。我還沒有想出到底發生了什麼,但我已經找到了解決方案 - 現在,我使用的FreeImage從資源文件加載PNG,然後創建從FIBITMAP原始圖像數據的位圖對象。這是完美的工作,所以證據指出該位圖構造函數的問題。

更新2:

所以爲了方便起見,我決定用它來加載我所有的圖像,但它遇到了麻煩加載標準的BMP文件我創建使用的FreeImage從資源加載PNG文件類的偉大工程。有點調查後,似乎當你包括BMP文件作爲位圖資源,第一個14個字節的BMP文件的他們存儲在資源包,這使得它棘手爲別的,就加載它們之前被剝離。無論如何,它很容易摸索, - 我剛換了「位圖」資源的資源類型爲「BMP」因此,它基本上把它當作一個未知的類型和存儲整個文件。所以現在它都按預期工作。只是以爲我會發布的經驗,並希望如果他們嘗試做同樣的事情一個小時救他人。

回答

0

所以我最終自己找到了答案(只是更新這個,以便我可以將其標記爲已回答)。

在某些情況下,似乎存在某種與GDI +相關的錯誤以及PNG中的透明度。我解決了這個問題,使用FreeImage來加載PNG,但這導致了BMP的另一個問題。看起來,VS中的BITMAP資源中有14個字節被剝離掉了,大概是因爲如果你已經告訴VS它是一個位圖,這是多餘的信息。如果你使用LoadImage()或任何標準的WinAPI函數加載資源,但是如果你使用另一個庫(就像我使用FreeImage一樣),那麼這通常很好,那麼你需要將資源類型改爲IMAGE(或者不是BITMAP ),然後再嘗試使用LoadResource加載它。

0

放了一堆跟蹤語句和XP上運行,必須有一些錯誤代碼的地方返回。儘量不要使用MFC包裝類並調用原始的底層win32 API。我與CImage和朋友有過不愉快的經歷;我所做的是將png轉換爲32位位圖(bmp's),使用:: LoadImage()加載它們並使用:: AlphaBlt()繪製它們。

另外,嘗試一個沒有透明度的PNG - 我遇到的所有問題都是帶有每像素透明度的圖像。如果可行的話,你至少知道開始尋找的方向。

+0

感謝您的建議羅爾 - 我已經成功地找到一個解決方案(見上文)和我的預感是,有一個在我用它搞砸了alpha通道的位圖(的IStream *)構造有些不對頭。不幸的是,我沒有別的選擇,只能使用具有透明度的PNG - 這是我首先使用它們的原因之一。 – Redeye