我有这段代码,它在运行时执行了几次:
// 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 written中,步幅值特定于IWICBitmapLock,而不是位图。但是,我每次都发布了pLock。那么这种行为可能是什么原因呢?
我可以使用的第二种方法是这样的,但我想了解上面的代码有什么问题。
m_pWICBitmap->Release();
m_pWICImagingFactory->CreateBitmapFromSource(m_pWICBitmapCopy, WICBitmapCacheOnDemand, &m_pWICBitmap);