15,980
社区成员




用D2D加载出来的Gif,其中那些大量灰色点都是渲染位图的背景色,绘制gif时由于错误的透明像素被显示出来了,正常gif在下面
主要代码:
int CS4D2dAssist::LoadBitmapsFromFile(ID2D1RenderTarget * pRT, vector<CComPtr<ID2D1Bitmap>>& vBitmaps, LPCTSTR szFile)
{
vBitmaps.clear();
CString strFile = szFile;
if (!GetFullPathName(strFile))
return 0;
HRESULT hr = S_OK;
CComPtr<IWICBitmapDecoder> pDecoder = NULL;
hr = m_pWicFactory->CreateDecoderFromFilename(strFile, NULL, GENERIC_READ, WICDecodeMetadataCacheOnDemand, &pDecoder); //使用WICDecodeMetadataCacheOnLoad发现有jpeg文件创建decoder失败
return GetBitmapsFromDecoder(pRT, pDecoder, vBitmaps);
}
int CS4D2dAssist::GetBitmapsFromDecoder(ID2D1RenderTarget *pRT, CComPtr<IWICBitmapDecoder> &pDecoder, vector<CComPtr<ID2D1Bitmap>> &vBitmaps)
{
HRESULT hr;
UINT nCount;
hr = pDecoder->GetFrameCount(&nCount);
for (int i = 0; i < nCount; i++)
{
CComPtr<IWICBitmapFrameDecode> pSource = NULL;
CComPtr<IWICFormatConverter> pConverter = NULL;
CComPtr<IWICBitmapScaler> pScaler = NULL;
hr = pDecoder->GetFrame(i, &pSource);
hr = m_pWicFactory->CreateFormatConverter(&pConverter);
hr = pConverter->Initialize(pSource, GUID_WICPixelFormat32bppPBGRA, WICBitmapDitherTypeNone, NULL, 0.f, WICBitmapPaletteTypeMedianCut);
// Create a Direct2D bitmap from the WIC bitmap.
CComPtr < ID2D1Bitmap> pBitmap;
hr = pRT->CreateBitmapFromWicBitmap(pConverter, &pBitmap);
vBitmaps.push_back(pBitmap);
}
return vBitmaps.size();
}
该问题已解决,gif需要通过meta读取全局尺寸,背景色和每一帧的位置以及绘制方式,然后按正确方式和位置绘制