teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

サンプルコード追加

2019/12/23 12:57

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -7,4 +7,22 @@
7
7
  `CImage::Load(IStream* pStream)`はストリームからの読み込みです。
8
8
  というわけで、`IStream`をメモリ上から生成してやれば読み込めます。
9
9
 
10
- `IStream`は[`GlobalAlloc`](https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-globalalloc)でメモリ確保して得られたハンドルに対して[`CreateStreamOnHGlobal`](https://docs.microsoft.com/en-us/windows/win32/api/combaseapi/nf-combaseapi-createstreamonhglobal)を呼ぶと生成できます。
10
+ `IStream`は[`GlobalAlloc`](https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-globalalloc)でメモリ確保して得られたハンドルに対して[`CreateStreamOnHGlobal`](https://docs.microsoft.com/en-us/windows/win32/api/combaseapi/nf-combaseapi-createstreamonhglobal)を呼ぶと生成できます。
11
+
12
+ (追記)
13
+ 以下のコードでメモリ上のPNGデータをCImageに読み込めることを確認しました。
14
+ エラーチェックは省いています。
15
+ ```C++
16
+ IStream* pIstream = NULL;
17
+ //IStream生成
18
+ CreateStreamOnHGlobal(NULL, TRUE, &pIstream);
19
+ //PNGデータ書き込み
20
+ pIstream->Write(PNGデータポインタ, PNGデータサイズ, NULL);
21
+ //CImageに読み込み
22
+ CImage image;
23
+ image.Load(pIstream);
24
+ //CImageを使用した操作(例としてBMP保存)
25
+ image.Save(_T("c:\tmp\test.bmp"), Gdiplus::ImageFormatBMP);
26
+ //IStream解放
27
+ pIstream->Release();
28
+ ```