2016-08-01 47 views
0

카메라에서 라이브 뷰 비디오를 표시하고 있습니다. 모든 프레임은 할당해야하는 바이트 배열 (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); 
+0

어떤 형식 이미지는 바이트 배열의 데이터입니까? 비트 맵인가요? 헤더가 있습니까? –

+0

원하는대로 'IStream'을 만들 수 있습니다. 정의 된 유일한 인터페이스 일뿐 아니라 실제로 원하는대로 구현할 수 있습니다. –

+0

@o_wiseman - DSLR 뷰 파인더의 원시 데이터가 100 % 확실하지 않습니다. 내 생각 엔이 모든 GlobalLock/memcpy 작업 과정에서 데이터 자체에 아무 것도 수행되지 않는다는 것을 고려하면 일반 비트 맵이라는 것입니다. – greg

답변

0

감사 : 여기

는 코드입니다. 코드가 훨씬 깨끗하지만 SHCreateMemStream이 내부적으로 복사본을 생성하는지 확실하지 않습니다. (문서가 명확하지 않습니다)

[편집] 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