2011-03-17 7 views
11

Metoda GDI + Image::Save wymaga parametru CLSID do określenia używanego kodera. Dokumentacja wskazuje na some sample code uzyskanie kodera związanego z określonym typem MIME, takim jak image/jpeg lub image/png. Jednak nie zgadzam się na kopiowanie funkcji pół-strony tylko po to, aby wesprzeć 1-wierszową pomoc w debugowaniu, w której zapisuję wynik pośredni na dysku.Czy GDI + ma standardowe identyfikatory CLSID kodera obrazu?

Czy nie powinna istnieć lista standardowych identyfikatorów CLSID dla standardowych koderów? Gdzie znajdę taką listę? Nie udało mi się znaleźć, przeszukując pliki dołączane przez Microsoft.

Odpowiedz

5

Nie ma ani jednego. Myślę, że zamierzali rozszerzyć listę kodeków i obsługiwać wtyczki, ale nigdy się do tego nie zbliżali. Biorąc pod uwagę, że nie wprowadziły one żadnych zmian w GDI + od dłuższego czasu, najprawdopodobniej nie nastąpi to w najbliższym czasie. Prawdopodobnie można uciec z generowaniem własnej, zakodowanej listy w oparciu o wyliczenie Gdiplus :: GetImageEncoders.

Czyli:

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} 

Oto funkcja I rutynowo wyciąć & pastę pomiędzy projektami uzyskania na CLSID enkodera. Można go zmodyfikować tak, aby był podglądem tabeli.

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

Prawdopodobnie będziesz chciał użyć ImageCodecInfo z GetImageEncodersSize() i GetImageEncoders() Nie jestem świadomy łatwiejszego sposobu.

EDIT: Jeśli wiesz, co dokładnie chcesz i cholera całą resztę można uciec z robieniem czegoś takiego ...

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

to jest dokładnie to, co starałem się zrobić, ale 'GetEncoderClsid' nie jest częścią GDI + - trzeba skopiować go z dokumentacją. –

+0

Ach masz rację ... Wow, przypuśćmy, że to było niedopatrzenie? – AJG85

2

Jeśli chcesz po prostu napisać PNG, to wydaje się działać:

// 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); 

Zanotować formatowania wartości hex.

Od: How to initialize a constant CLSID

Powiązane problemy