2011-03-17 4 views
11

Phương thức GDI + Image::Save yêu cầu tham số CLSID để chỉ định bộ mã hóa để sử dụng. Tài liệu hướng tới some sample code để nhận bộ mã hóa được liên kết với một loại MIME cụ thể, chẳng hạn như hình ảnh/jpeg hoặc hình ảnh/png. Tuy nhiên, tôi đang balking với ý nghĩ sao chép một nửa trang chức năng chỉ để hỗ trợ một dòng hỗ trợ gỡ lỗi, nơi tôi lưu một kết quả trung gian ra đĩa.GDI + có CLSID bộ mã hóa hình ảnh chuẩn không?

Không nên có danh sách CLSID chuẩn cho bộ mã hóa tiêu chuẩn? Tôi sẽ tìm thấy danh sách đó ở đâu? Tôi đã không thể tìm thấy một bằng cách tìm kiếm các tập tin bao gồm của Microsoft.

Trả lời

5

Có không phải là một. Tôi nghĩ rằng họ dự định danh sách codec để được mở rộng và hỗ trợ bổ sung, nhưng không bao giờ có xung quanh với nó. Do họ không thực hiện bất kỳ thay đổi nào đối với GDI + trong một thời gian dài, chúng có thể sẽ không sớm xảy ra. Bạn có thể có thể lấy đi với việc tạo ra danh sách mã hóa cứng của riêng bạn dựa trên một điều tra của Gdiplus :: GetImageEncoders.

Đó là:

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} 

Dưới đây là các chức năng tôi thường cắt & dán giữa các dự án để nhận tại CLSID của encoder. Bạn có thể sửa đổi nó thành tra cứu bảng.

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

Có thể bạn sẽ muốn sử dụng ImageCodecInfo với GetImageEncodersSize()GetImageEncoders() Tôi không biết bất kỳ cách nào dễ dàng hơn.

EDIT: Nếu bạn biết chính xác những gì bạn muốn và nguyền rủa tất cả các phần còn lại bạn có thể nhận được ngay với làm điều gì đó như thế này ...

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

Đó chính xác là những gì tôi đã cố gắng để làm, nhưng 'GetEncoderClsid' không phải là một phần của GDI + - bạn phải sao chép nó từ tài liệu. –

+0

Ah bạn đúng ... wow giả sử đó là một sự giám sát? – AJG85

2

Nếu bạn chỉ muốn viết một PNG, điều này dường như làm việc:

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

Lưu ý các format của các giá trị hex.

Từ: How to initialize a constant CLSID