gpt4 book ai didi

com - 如何使用 C++ 访问 WriteableBitmap.PixelBuffer 像素?

转载 作者:行者123 更新时间:2023-12-04 14:28:06 28 4
gpt4 key购买 nike

C# 的示例很多,但 MSDN 上只有一些 C++ 的代码片段。我已经把它放在一起,我认为它会起作用,但我不确定我是否要发布我必须发布的所有 COM 引用。

最佳答案

您的代码是正确的——IBufferByteAccess 上的引用计数*buffer的界面通过调用 QueryInterface 递增,并且您必须调用 Release一次以释放该引用。

但是,如果您使用 ComPtr<T> ,这变得简单多了——使用 ComPtr<T> ,您不能调用 IUnknown 的三个成员中的任何一个( AddRefReleaseQueryInterface );它会阻止你调用他们。相反,它以一种难以搞砸的方式封装对这些成员函数的调用。这是一个外观示例:

// Get the buffer from the WriteableBitmap:
IBuffer^ buffer = bitmap->PixelBuffer;

// Convert from C++/CX to the ABI IInspectable*:
ComPtr<IInspectable> bufferInspectable(AsInspectable(buffer));

// Get the IBufferByteAccess interface:
ComPtr<IBufferByteAccess> bufferBytes;
ThrowIfFailed(bufferInspectable.As(&bufferBytes));

// Use it:
byte* pixels(nullptr);
ThrowIfFailed(bufferBytes->Buffer(&pixels));

调用 bufferInspectable.As(&bufferBytes)执行安全 QueryInterface :它根据 bufferBytes 的类型计算 IID , 执行 QueryInterface , 并将结果指针附加到 bufferBytes .当 bufferBytes超出范围,它会自动调用 Release .该代码与您的代码具有相同的效果,但没有容易出错的显式资源管理。

该示例使用以下两个实用程序,有助于保持代码整洁:
auto AsInspectable(Object^ const object) -> Microsoft::WRL::ComPtr<IInspectable>
{
return reinterpret_cast<IInspectable*>(object);
}

auto ThrowIfFailed(HRESULT const hr) -> void
{
if (FAILED(hr))
throw Platform::Exception::CreateException(hr);
}

细心的读者会注意到,因为这段代码使用了 ComPtr对于 IInspectable*我们从 buffer 获得,这段代码实际上执行了一个额外的 AddRef/ Release与原始代码相比。我认为这种影响性能的可能性很小,最好从易于验证是否正确的代码开始,然后在了解热点后优化性能。

关于com - 如何使用 C++ 访问 WriteableBitmap.PixelBuffer 像素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13708755/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com