gpt4 book ai didi

c++ - CImage::Load() 从内存不使用 CreateStreamOnHGlobal

转载 作者:行者123 更新时间:2023-11-30 05:24:22 32 4
gpt4 key购买 nike

我正在显示来自相机的实时取景视频。我将每一帧下载到我必须分配的字节数组 (pImageData) 中。

现在,为了显示,我正在使用 CImage (MFC)。但是,我找到的所有样本都是基于使用 GlobalAlloc、另一个 memcpy 和 CreateStreamOnHGlobal。

我想避免进行另一次分配/取消分配和内存复制。每帧超过 2mb,我正在插入 30 fps!

是否可以在非基于 HGLOBAL 的内存上创建 IStream?或者是否可以通过某种方式强制 Image::Load() 使用字节数组?

代码如下:

// pImageData is an array with bytes, size is the sizeOfThatArray

CComPtr<IStream> stream;

HGLOBAL hMem = ::GlobalAlloc(GHND, size);
LPVOID pBuff = ::GlobalLock(hMem);

memcpy(pBuff, pImageData, size); // <-- would like to avoid this

::GlobalUnlock(hMem);

CreateStreamOnHGlobal(hMem, TRUE, &stream); // <-- or create stream on non-hglobal memory

CImage image;
image.Load(stream); // <-- Or load directly from pImageData

// .. display image

image.Destroy();

::GlobalFree(hMem);

最佳答案

感谢 Hans 指出 SHCreateMemStream,我不知道它的存在。代码简洁多了,但还是不确定 SHCreateMemStream 是否在内部创建了一个拷贝(文档不清楚)

[edit] 根据 Jonathan 的评论,看起来它仍然需要在内部制作一份拷贝。当..

最终代码

// pImageData is an array with bytes, size is the sizeOfThatArray

// Still not clear if this is making a copy internally
IStream* pMemStream = SHCreateMemStream(pImageData, size);

CComPtr<IStream> stream;

stream.Attach(pMemStream); // Need to Attach, otherwise ownership is not transferred and we leak memory

CImage image;
image.Load(stream);

// .. display image

image.Destroy();

// No need for further cleanup, CComPtr does the job

关于c++ - CImage::Load() 从内存不使用 CreateStreamOnHGlobal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38691416/

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