No hay una sola. Creo que tenían la intención de que la lista de códecs fuera extensible y soportara complementos, pero nunca llegó a hacerlo. Dado que no han realizado ningún cambio en GDI + en bastante tiempo, es probable que no lo hagan pronto. Probablemente pueda salirse con la suya generando su propia lista codificada en base a una enumeración de Gdiplus :: GetImageEncoders.
Eso es:
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}
Aquí es la función que rutinariamente cortar & pasta entre los proyectos para conseguir en el CLSID del codificador. Podrías modificarlo para que sea una tabla de búsqueda.
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;
}
eso es exactamente lo que he intentado hacer, pero 'GetEncoderClsid' no es parte de GDI + - tienes que copiarlo de la documentación. –
Ah, tienes razón ... wow, ¿supones que fue un descuido? – AJG85