0

我有这段代码,它在运行时执行了几次:

// Restore the bitmap from the copy
IWICBitmapLock *pLock = NULL;
UINT cbStride = 0;
hr = m_pWICBitmapCopy->GetSize(&uiWidth,&uiHeight);
WICRect rcLock = { 0, 0, uiWidth, uiHeight };
hr = m_pWICBitmapCopy->Lock(&rcLock, WICBitmapLockRead, &pLock);
hr = pLock->GetDataPointer(&cbBufferSize, &pv);
hr = pLock->GetStride(&cbStride);
m_pWICBitmap->Release();
hr = m_pWICImagingFactory->CreateBitmapFromMemory(uiWidth,uiHeight,GUID_WICPixelFormat32bppPBGRA,cbStride,cbBufferSize,pv,&m_pWICBitmap);
hr = pLock->Release();

uiWidth并且uiHeight总是不同,初始值是 3264 和 2448。第二次可能是 778 和 246。但是方法pLock->GetStride(&cbStride)总是返回相同的步幅值(在我的例子中是 13056)。它会导致该CreateBitmapFromMemory()方法创建损坏的位图。其他变量会根据位图尺寸正确变化。它看起来像是pLock某处缓存的步幅值。

MSDN 中写道,步幅值特定于 IWICBitmapLock,而不是位图。但是,我确实每次都释放 pLock。那么这种行为的原因可能是什么?

我可以用来做同样事情的第二种方法是这样的,但我想了解上面的代码有什么问题。

m_pWICBitmap->Release();
m_pWICImagingFactory->CreateBitmapFromSource(m_pWICBitmapCopy, WICBitmapCacheOnDemand, &m_pWICBitmap);
4

0 回答 0