我有一个简单的函数,它加载一个 Png 文件并将其作为 ID2D1Bitmap 返回。但是当它试图调用 CreateBitmapfromWicBitmap 函数时,它会给出一个调试断言错误。有趣的是,我首先在一个单独的项目中创建了一个 imageload 函数,它在那里工作得很好。这两个函数具有相同的代码,而第二个函数给出错误。
这是错误代码:
ID2D1Bitmap* Wnd::LoadPng(LPCWSTR Path) {
CComPtr<IWICBitmapDecoder> pDecoder;
CComPtr<IWICBitmapFrameDecode> pFrame;
CComPtr<ID2D1Bitmap> pBit;
CComPtr<IWICFormatConverter> pConv;
HRESULT Hr;
Hr = m_pWICFactory->CreateDecoderFromFilename(Path,NULL,GENERIC_READ,WICDecodeMetadataCacheOnDemand,&pDecoder);
if (SUCCEEDED(Hr)) {
Hr = m_pWICFactory->CreateFormatConverter(&pConv);
}
if (SUCCEEDED(Hr)) {
Hr = pDecoder->GetFrame(0,&pFrame);
}
if (SUCCEEDED(Hr)) {
Hr = pConv->Initialize(pFrame,GUID_WICPixelFormat32bppPBGRA,WICBitmapDitherTypeNone,0,0.f,WICBitmapPaletteTypeCustom);
}
if (SUCCEEDED(Hr)) {
Hr = m_pRT->CreateBitmapFromWicBitmap(pConv,0,&pBit);
}
return pBit;
}
错误发生在 atlcomcli.h 函数 _NoAddRefReleaseOnCComPtr 的第 182 行。
我仔细检查了所有头文件和库,它们在两个项目中都是相同的(在第二个项目中有一些额外的头文件)。
这是有效的代码:
CComPtr<IWICFormatConverter> Conv;
m_pWICFactory->CreateFormatConverter(&Conv);
CComPtr<IWICBitmapFrameDecode> Frame;
m_pDecoder->GetFrame(0,&Frame);
Frame->GetSize(&W,&H);
Conv->Initialize(Frame,GUID_WICPixelFormat32bppPBGRA,WICBitmapDitherTypeNone,0,0.f,WICBitmapPaletteTypeCustom);
CComPtr<ID2D1Bitmap> Bit;
Hr = m_pRT->CreateBitmapFromWicBitmap(Conv,0,&Bit);
m_pBitmap.push_back(Bit);
BitmapDecoder 在这里预定义,但它与第一个片段中的完全相同。
- - - - - - - - - - - - - - - - 固定的 - - - - - - - - - ----------
第三次我忘记为我的渲染目标调用初始化函数。