2011-03-17 44 views
11

GDI + Image::Save方法需要一个CLSID参数来指定要使用的编码器。该文档指向some sample code以获取与特定MIME类型(例如image/jpeg或image/png)关联的编码器。不过,我在考虑复制一个半页功能以支持1行调试帮助,并将一个中间结果保存到磁盘时感到很沮丧。GDI +是否具有标准图像编码器CLSID?

不应该有标准编码器的标准CLSID列表吗?我在哪里可以找到这样的清单?我一直无法通过搜索微软的包含文件找到一个。

回答

5

没有一个。我认为他们希望编解码器列表具有可扩展性并支持插件,但从未涉及到它。鉴于他们在一段时间内没有对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; 
} 
2

您可能会想要使用ImageCodecInfoGetImageEncodersSize()GetImageEncoders()我不知道任何更简单的方法。

编辑:如果你知道你想要具体是什么该死所有的休息,你可以逃脱做这样的事情......

CLSID pngClsid; 
GetEncoderClsid("image/png", &pngClsid); 
image.Save("imagename.png", &pngClsid, NULL); 
+2

这正是我试图做的,但'GetEncoderClsid'不是GDI +的一部分 - 你必须把它从文档复制。 – 2011-03-17 22:39:55

+0

啊,你是对的...哇,假设这是一个疏忽? – AJG85 2011-03-17 22:42:09

2

如果你只想写一个PNG,这似乎工作:

// image/png : {557cf406-1a04-11d3-9a73-0000f81ef32e} 
const CLSID pngEncoderClsId = { 0x557cf406, 0x1a04, 0x11d3,{ 0x9a,0x73,0x00,0x00,0xf8,0x1e,0xf3,0x2e } }; 
stat = image->Save(L"test.png", &pngEncoderClsId, NULL); 

注意的十六进制值的格式化。

来源: How to initialize a constant CLSID