2016-09-03 28 views
2

GDI +にはImageクラスが用意されています。このクラスを使用すると、1つの形式のイメージファイルを読み取り、このファイルを別の形式で保存できます。しかし、JPEGファイル(すでにメモリにロードされている)をデコードしたいのであれば、どうすればいいですか?GDI +ライブラリを使用してメモリ内のjpegをデコードする方法は?

+0

あなたがメモリにJPEGファイルをデコードする代わりに、WIC(Windowsイメージングコンポーネント)を使用することはできません任意の理由は? [いくつかのスターターサンプルへのリンクがあります。](https://msdn.microsoft.com/en-us/library/windows/desktop/ee720055(v = vs.85).aspx) –

+0

アドバイスをいただき、ありがとうございますWICを見てください。 – gylns

答えて

1

あなたはbufをJPEGデータ(または他の任意の互換性のある画像フォーマット)を含み、bufsizeは、そのデータの長さSHCreateMemStreamGdiplus::Image::FromStream

#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); 

を使用することができます。

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

関連する問題