static HRESULT ConvertPicture(IStreamPtr spSrcStream, IStreamPtr spDestStream, const WCHAR format, EncoderParameters pEncoderParameters = NULL)
{
CLSID clsid;
int nRet = GetEncoderClsid(format, &clsid);
if (nRet == -1)
{
return E_FAIL;
}
Status stat = Ok;
Image image = new Image(spSrcStream);
if (image == NULL)
{
return E_FAIL;
}
stat = image-GetLastStatus();
if (stat != Ok)
{
delete image;
return E_FAIL;
}
if (pEncoderParameters == NULL)
{
stat = image-Save(spDestStream, &clsid);
if (stat != Ok)
{
delete image;
return E_FAIL;
}
}
else
{
stat = image-Save(spDestStream, &clsid, pEncoderParameters);
if (stat != Ok)
{
delete image;
return E_FAIL;
}
}
delete image;
return S_OK;
}
// GDI+のヘルプからコピー
static int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
UINT num = 0; // number of image encoders
UINT size = 0; // size of the image encoder array in bytes
ImageCodecInfo* pImageCodecInfo = NULL;
GetImageEncodersSize(&num, &size);
if(size == 0)
return -1; // Failure
pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return -1; // Failure
GetImageEncoders(num, size, pImageCodecInfo);
for(UINT j = 0; j < num; ++j)
{
if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
{
*pClsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j; // Success
}
}
free(pImageCodecInfo);
return -1; // Failure
}