카메라에서 라이브 뷰 비디오를 표시하고 있습니다. 모든 프레임은 할당해야하는 바이트 배열 (pImageData)로 다운로드됩니다.CreateStreamOnHGlobal을 사용하지 않고 메모리에서 CImage :: Load()
이제는 표시하기 위해 CImage (MFC)를 사용하고 있습니다. 그러나 내가 찾은 모든 샘플은 GlobalAlloc, 또 다른 memcpy 및 CreateStreamOnHGlobal을 사용하는 것을 기반으로합니다.
다른 할당/할당 취소 및 메모리 복사를하지 않으려합니다. 각 프레임은 2MB 이상이고 나는 30fps를 밀고 있습니다!
비 -HGLOBAL 기반 메모리에서 IStream을 만들 수 있습니까? 또는 Image :: Load()를 바이트 배열로 작업하도록 강제 할 수 있습니까? 내가 몰랐던 SHCreateMemStream을 지적 한스에
// 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);
어떤 형식 이미지는 바이트 배열의 데이터입니까? 비트 맵인가요? 헤더가 있습니까? –
원하는대로 'IStream'을 만들 수 있습니다. 정의 된 유일한 인터페이스 일뿐 아니라 실제로 원하는대로 구현할 수 있습니다. –
@o_wiseman - DSLR 뷰 파인더의 원시 데이터가 100 % 확실하지 않습니다. 내 생각 엔이 모든 GlobalLock/memcpy 작업 과정에서 데이터 자체에 아무 것도 수행되지 않는다는 것을 고려하면 일반 비트 맵이라는 것입니다. – greg