- int GetEncoderClsid(const TCHAR* format, CLSID* pClsid)
- {
- UINT num = 0;
- UINT size = 0;
- ImageCodecInfo* pImageCodecInfo = NULL;
- GetImageEncodersSize(&num, &size);
- if(size == 0)
- return -1;
- pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
- if (pImageCodecInfo == NULL)
- return -1;
- GetImageEncoders(num, size, pImageCodecInfo);
- for (UINT j = 0; j < num; ++j)
- {
- if (_tcscmp(pImageCodecInfo[j].MimeType, format) == 0)
- {
- *pClsid = pImageCodecInfo[j].Clsid;
- free(pImageCodecInfo);
- return j;
- }
- }
- free(pImageCodecInfo);
- return -1;
- }
- HRESULT hr = E_FAIL;
- HGLOBAL gGlobal = GlobalAlloc(GMEM_MOVEABLE, 0);
- IStream* stream = nullptr;
- hr = CreateStreamOnHGlobal(gGlobal, TRUE, &stream);
- ASSERT(SUCCEEDED(hr));
- CLSID pngClsid;
- GetEncoderClsid(_T("image/png"), &pngClsid);
- hr = bitmap->Save(stream, &pngClsid, NULL);
- ASSERT(SUCCEEDED(hr));
- LARGE_INTEGER seekPos = { 0, };
- ULARGE_INTEGER imageSize = { 0, };
- hr = stream->Seek(seekPos, STREAM_SEEK_CUR, &imageSize);
- ASSERT(SUCCEEDED(hr));
- BYTE* buffer = new BYTE[imageSize.LowPart];
- hr = stream->Seek(seekPos, STREAM_SEEK_SET, 0);
- ASSERT(SUCCEEDED(hr));
- hr = stream->Read(buffer, imageSize.LowPart, 0);
- ASSERT(SUCCEEDED(hr));
- stream->Release();
- delete[] buffer;
- IStream* stream = SHCreateMemStream((BYTE*)buffer, bufferLen);
- Bitmap* bitmap = Gdiplus::Bitmap::FromStream(stream);
- stream->Release();
- delete bitmap;