C++/(Gdiplus)Bitmap Serialize

  1. int GetEncoderClsid(const TCHAR* format, CLSID* pClsid)
  2. {
  3.    UINT num = 0;
  4.    UINT size = 0;
  5.    ImageCodecInfo* pImageCodecInfo = NULL;
  6.    GetImageEncodersSize(&num, &size);
  7.    if(size == 0)
  8.       return -1;  // Failure
  9.    pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
  10.    if (pImageCodecInfo == NULL)
  11.       return -1;  // Failure
  12.    GetImageEncoders(num, size, pImageCodecInfo);
  13.    for (UINT j = 0; j < num; ++j)
  14.    {
  15.       if (_tcscmp(pImageCodecInfo[j].MimeType, format) == 0)
  16.       {
  17.          *pClsid = pImageCodecInfo[j].Clsid;
  18.          free(pImageCodecInfo);
  19.          return j;  // Success
  20.       }    
  21.    }
  22.    free(pImageCodecInfo);
  23.    return -1;  // Failure
  24. }
  1. // Serialize
  2. HRESULT hr = E_FAIL;
  3. HGLOBAL gGlobal = GlobalAlloc(GMEM_MOVEABLE, 0);
  4. IStream* stream = nullptr;
  5. hr = CreateStreamOnHGlobal(gGlobal, TRUE, &stream);
  6. ASSERT(SUCCEEDED(hr));
  7. CLSID pngClsid;
  8. GetEncoderClsid(_T("image/png"), &pngClsid);
  9. hr = bitmap->Save(stream, &pngClsid, NULL); // bitmap <- Gdiplus::Bitmap
  10. ASSERT(SUCCEEDED(hr));
  11. // 저장된 이미지를 위한 버퍼 할당
  12. LARGE_INTEGER seekPos = { 0, };
  13. ULARGE_INTEGER imageSize = { 0, };
  14. hr = stream->Seek(seekPos, STREAM_SEEK_CUR, &imageSize);
  15. ASSERT(SUCCEEDED(hr));
  16. BYTE* buffer = new BYTE[imageSize.LowPart];
  17. // 스트림으로부터 버퍼 채움
  18. hr = stream->Seek(seekPos, STREAM_SEEK_SET, 0);
  19. ASSERT(SUCCEEDED(hr));
  20. hr = stream->Read(buffer, imageSize.LowPart, 0);
  21. ASSERT(SUCCEEDED(hr));
  22. // buffer <- Serialized data
  23. // ...
  24. // Cleanup
  25. stream->Release();
  26. delete[] buffer;
  1. // Deserialize
  2. IStream* stream = SHCreateMemStream((BYTE*)buffer, bufferLen);
  3. Bitmap* bitmap = Gdiplus::Bitmap::FromStream(stream);
  4. stream->Release();
  5. delete bitmap;

이 글에는 0 개의 댓글이 있습니다.