2010-08-18 6 views
3

CImage를 사용하여 BYTE * 배열에서 이미지를로드하려면 어떻게해야합니까? 지금까지 임시 파일을 만드는 것만으로도이 작업을 수행하는 것은 매우 비쌉니다. 아마도 라이브러리가 있지만 다른 라이브러리에 연결하고 싶지는 않습니다. 이미지 크기를 얻으려면 모두 필요합니다. 효과적으로 화면으로 표시하고 C 화상 내가 그것을 위해 필요한 모든 것입니다 ...ATL CImage를 사용하여 메모리 버퍼에서 이미지로드

P-> pbData가 바이트 * 배열 및 P-> dwDataLen 배열의 크기를

내 코드를 누르고 있습니다 DWORD입니다 :

ATL::CAtlTemporaryFile TempFile; 
TempFile.Create(NULL, GENERIC_WRITE | GENERIC_READ); 
TempFile.Write(p->pbData, p->dwDataLen); 
TempFile.HandsOff(); 
ATL::CImage m_image; 
m_image.Load(TempFile.TempFileName()); 
    TempFile.Close(); 
int h = m_image.GetHeight(); 
int w = m_image.GetWidth(); 
// rest of code here 

    m_image.Destroy(); 
m_image.ReleaseGDIPlus();` 

답변

2

당신은 CImage :: Load (IStream *) 함수로 할 수 있습니다. CreateStreamOnHGlobal()에서 IStream을 가져 오거나 자신 만의 IStream을 만들 수 있습니다.

파일을 사용하는 것이 실제로 우수한 솔루션이라는 점에 유의하십시오. CImage는 메모리 매핑 된 파일을 만들어 이미지에서 픽셀을로드합니다. 메모리에서로드 할 때 메모리를 두 배로 늘리면 페이징 파일에 부담을 느낄 것입니다. 이미지가 클 경우 문제가 발생합니다.

3
bool Create(BYTE* heap, DWORD heap_len, CImage& img) 
{ 
    bool ret = false; 
    HGLOBAL hGlobal = ::GlobalAlloc(GHND, heap_len); 
    LPBYTE lpByte = (LPBYTE)::GlobalLock(hGlobal); 
    CopyMemory(lpByte, heap, heap_len); 
    ::GlobalUnlock(hGlobal); 
    IStream* pStream = NULL; 
    if (SUCCEEDED(::CreateStreamOnHGlobal(hGlobal, FALSE, &pStream))) 
    { 
     img.Destroy(); 
     img.Load(pStream); 
     pStream->Release(); 
     ret = true; 
    } 
    GlobalFree(hGlobal); 
    return ret; 
} 
0
HRESULT Load(
    IStream* pStream 
) throw(); 

pStream 이름 로딩 이미지 파일을 함유하는 스트림에 대한 포인터.

그래서 힙 버퍼가 파일 경로로 구성되어 있지 않으면 위의 솔루션이 작동하지 않습니다.;)

+1

우선 무엇보다 유효한 대답은 아닙니다. 그런 다음, 당신이 참조하는 메서드는 내부적으로 ['GdiPlus :: Bitmap'] (https://msdn.microsoft.com/en-us/library/ms536319) 생성자를 호출하는데, 실제로 파일 이름뿐만 아니라 스트림을 가져옵니다. –

관련 문제