如何从SoftwareBitmap(UWP)正确释放BitmapBuffer?

时间:2018-03-13 07:39:32

标签: windows uwp windows-10-universal c++-cx windows-10-iot-core

我很难在UWP的C ++ / CX代码中正确释放用The Key you want is : VgC4b9K-gYU 方法锁定的BitmapBuffer

基本代码如下所示(它是来自Microsoft的OpenCV网桥示例here

SoftwareBitmap.LockBuffer()

然后使用此缓冲区(bool OpenCVHelper::GetPointerToPixelData(SoftwareBitmap^ bitmap, unsigned char** pPixelData, unsigned int* capacity) { BitmapBuffer^ bmpBuffer = bitmap->LockBuffer(BitmapBufferAccessMode::ReadWrite); IMemoryBufferReference^ reference = bmpBuffer->CreateReference(); ComPtr<IMemoryBufferByteAccess> pBufferByteAccess; if ((reinterpret_cast<IInspectable*>(reference)->QueryInterface(IID_PPV_ARGS(&pBufferByteAccess))) != S_OK) { return false; } if (pBufferByteAccess->GetBuffer(pPixelData, capacity) != S_OK) { return false; } return true; } )初始化pPixelData对象(浅拷贝)。并且永远不会被释放。

对同一cv:Mat个对象的LockBuffer()连续调用会引发异常:

  

Platform :: AccessDeniedException ^在内存位置0x00000002CEEFDCC0。 HRESULT:0x80070005访问被拒绝。   WinRT信息:采用位图共享锁

如何正确释放此缓冲区?特别是在C ++ / CX?

我试图保留引用以在不再需要时释放它。在C ++ / CX中Dispose()或Close()方法是不可访问的,编译器建议改为调用析构函数:

SoftwareBitmap

但它不起作用(什么都不做)。正在调用析构函数,但另一次调用LockBuffer()会引发与以前相同的错误。

1 个答案:

答案 0 :(得分:1)

  

如何从SoftwareBitmap(UWP)正确释放BitmapBuffer?

BitmapBufferIMemoryBufferReference完成工作后,可以通过调用delete表达式来关闭这些对象。更多详情请查看Destructors。例如:

SoftwareBitmap^ bitmap = ref new SoftwareBitmap(
    BitmapPixelFormat::Bgra8,
    100,
    200,
    BitmapAlphaMode::Premultiplied);
BitmapBuffer^ bmpBuffer = bitmap->LockBuffer(BitmapBufferAccessMode::ReadWrite); 
IMemoryBufferReference^ reference = bmpBuffer->CreateReference();
delete reference;
delete bmpBuffer; 
BitmapBuffer^ bmpBuffer2 = bitmap->LockBuffer(BitmapBufferAccessMode::ReadWrite);

如上面的代码片段所示,在删除BitmapBuffer对象后,您可以再次成功锁定缓冲区。