2016-09-03 9 views
2

GDI +는 Image 클래스를 제공하며이 클래스를 사용하여 한 가지 형식의 이미지 파일을 읽은 다음이 파일을 다른 형식으로 저장할 수 있습니다. 그러나 jpeg 파일 (이미 메모리에로드 됨)을 디코드하려면 어떻게해야합니까?GDI + 라이브러리를 사용하여 메모리의 jpeg를 디코딩하는 방법은 무엇입니까?

+0

메모리에 사진과 디코딩을 대신 WIC (Windows 이미징 구성 요소)를 사용할 수 없습니다 이유라도? [다음은 몇 가지 시작 샘플에 대한 링크입니다.] (https://msdn.microsoft.com/en-us/library/windows/desktop/ee720055 (v = vs.85) .aspx) –

+0

조언 해 주셔서 감사합니다. WIC를 살펴보십시오. – gylns

답변

1
당신은 SHCreateMemStream을 사용할 수 있습니다

buf는 JPEG 데이터 (또는 다른 호환되는 이미지 형식)를 포함

#include <Window.h> 
#include <Gdiplus.h> 
#include <Shlwapi.h> 
#include <atlbase.h> 
... 
CComPtr<IStream> stream; 
stream.Attach(SHCreateMemStream(buf, bufsize)); 
Gdiplus::Image *image = Gdiplus::Image::FromStream(stream); 

Gdiplus::Image::FromStreambufsize 해당 데이터의 길이입니다.

SHCreateMemStream"Shlwapi.lib" 라이브러리가 필요합니다.

예 :

void foo(HDC hdc) 
{ 
    //Read jpeg from input file in to buf: 
    HANDLE hfile = CreateFile(L"test.jpg", 
     GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 
    if (!hfile) return; 

    DWORD bufsize = GetFileSize(hfile, NULL); 
    BYTE *buf = new BYTE[bufsize]; 

    DWORD temp; 
    ReadFile(hfile, buf, bufsize, &temp, 0); 

    //convert buf to IStream  
    CComPtr<IStream> stream; 
    stream.Attach(SHCreateMemStream(buf, bufsize)); 

    //Read from IStream  
    Gdiplus::Bitmap *image = Gdiplus::Bitmap::FromStream(stream); 
    if (image) 
    { 
     Gdiplus::Graphics g(hdc); 
     g.DrawImage(image, 0, 0); 
     delete image; 
    } 

    delete[]buf; 
    CloseHandle(hfile); 
} 

편집 : 코멘트에 언급 한 바와 같이 쉬운 방법 :

IStream* stream = SHCreateMemStream(buf, bufsize); 
Gdiplus::Image *image = Gdiplus::Image::FromStream(stream); 
... 
stream->Release(); 
+0

그건 내가 원하는거야. 감사. – gylns

+0

사실 내가 잘못 했으므로 자원 누출의 원인이 될 수 있습니다. 편집 된 버전으로 수정해야합니다. 'CComPtr'이 필요합니다. Visual Stduio를 사용합니까? –

+0

예,하지만 리소스 누출이 발생하면 어떻게해야합니까? – gylns