Ответ 1
Нет. Я думаю, они намеревались, чтобы список кодеков был расширяемым и поддерживал плагины, но так и не добрался до него. Учитывая, что они не внесли никаких изменений в GDI + в течение некоторого времени, они, скорее всего, не будут в ближайшее время. Вероятно, вам удастся создать собственный жесткий кодированный список, основанный на перечислении Gdiplus:: GetImageEncoders.
То есть:
image/bmp : {557cf400-1a04-11d3-9a73-0000f81ef32e}
image/jpeg : {557cf401-1a04-11d3-9a73-0000f81ef32e}
image/gif : {557cf402-1a04-11d3-9a73-0000f81ef32e}
image/tiff : {557cf405-1a04-11d3-9a73-0000f81ef32e}
image/png : {557cf406-1a04-11d3-9a73-0000f81ef32e}
Здесь функция, которую я обычно разрезаю и вставляю между проектами для получения в CLSID кодировщика. Вы можете изменить его для поиска в таблице.
HRESULT GetGdiplusEncoderClsid(__in LPCWSTR pwszFormat, __out GUID *pGUID)
{
HRESULT hr = E_FAIL;
UINT nEncoders = 0; // number of image encoders
UINT nSize = 0; // size of the image encoder array in bytes
CAutoVectorPtr<BYTE> spData;
Gdiplus::ImageCodecInfo* pImageCodecInfo = NULL;
Gdiplus::Status status;
bool fFound = false;
// param check
if ((pwszFormat == NULL) || (pwszFormat[0] == 0) || (pGUID == NULL))
{
return E_POINTER;
}
*pGUID = GUID_NULL;
status = Gdiplus::GetImageEncodersSize(&nEncoders, &nSize);
if ((status != Gdiplus::Ok) || (nSize == 0))
{
return E_FAIL;
}
spData.Allocate(nSize);
if (spData == NULL)
{
return E_FAIL;
}
pImageCodecInfo = (Gdiplus::ImageCodecInfo*)(BYTE*)spData;
status = Gdiplus::GetImageEncoders(nEncoders, nSize, pImageCodecInfo);
if (status != Gdiplus::Ok)
{
return E_FAIL;
}
for(UINT j = 0; j < nEncoders; ++j)
{
if( wcscmp(pImageCodecInfo[j].MimeType, pwszFormat) == 0 )
{
*pGUID = pImageCodecInfo[j].Clsid;
fFound = true;
break;
}
}
hr = fFound ? S_OK : E_FAIL;
return hr;
}