IWICBitmap from IStream (windows imaging component) Why CreateDecoderFromStream returns WINCODEC_ERR_COMPONENT_NOT_FOUND?

這問題卡了我整整一天半,差點要開一個 Daily WTF catalog 來放這篇文章了。

問題很簡單,我要開一個 Direct2D 的 BITMAP (ID2D1Bitmap),因此需要先開一個 IWICBitmap。MSDN 有二個 sample code 如下:

  1. 如何從 bitmap resource 建立 IWICBitmap
  2. 如何從 bitmap file 建立 IWICBitmap

在一字不差使用 msdn sample code 的情況下,從檔案可以成功建立,從 resource 就不行,錯誤點是 CreateDecoderFromStream() 錯誤碼是 WINCODEC_ERR_COMPONENT_NOT_FOUND。

因為是 msdn 的 sample code,出錯機率應該不高,而且二種方法其實 code 八成長得都一樣。網路上找了半天,有人有同樣問題,可是沒有有用的解答。

最後結局很可笑,win32 application 在載入 bitmap 到 resource 時,看來會把標準 BITMAP 的 14 bytes header 刪除 (why they want to do that…),所以從 LockResource() 得到的 bitmap data 是少了 14 bytes 的資料,因為不是標準的圖檔,所以當然不會有適合的 decoder。

詳細解決方法我貼到 stackoverflow 上了。