#keywords C++,CLSID,GDI+ {{{#!gcode // 주요 이미지 형식의 CLSID const CLSID CLSID_PNG = {0x557cf406, 0x1a04, 0x11d3, {0x9a, 0x73, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e}}; const CLSID CLSID_JPEG = {0x557cf401, 0x1a04, 0x11d3, {0x9a, 0x73, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e}}; const CLSID CLSID_BMP = {0x557cf400, 0x1a04, 0x11d3, {0x9a, 0x73, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e}}; const CLSID CLSID_GIF = {0x557cf402, 0x1a04, 0x11d3, {0x9a, 0x73, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e}}; const CLSID CLSID_TIFF = {0x557cf405, 0x1a04, 0x11d3, {0x9a, 0x73, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e}}; }}} ---- {{{+2 기타: CLSID 동적으로 얻기 }}} {{{#!gcode #include #include #include #pragma comment(lib, "gdiplus.lib") using namespace Gdiplus; // CLSID를 얻는 함수 int GetEncoderClsid(const WCHAR* format, CLSID* pClsid) { UINT num = 0, size = 0; GetImageEncodersSize(&num, &size); if (size == 0) return -1; ImageCodecInfo* pImageCodecInfo = (ImageCodecInfo*)(malloc(size)); if (!pImageCodecInfo) return -1; GetImageEncoders(num, size, pImageCodecInfo); for (UINT i = 0; i < num; ++i) { if (wcscmp(pImageCodecInfo[i].MimeType, format) == 0) { *pClsid = pImageCodecInfo[i].Clsid; free(pImageCodecInfo); return i; } } free(pImageCodecInfo); return -1; } // 사용 예제 int main() { GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); // PNG 형식의 CLSID 얻기 CLSID clsid; if (GetEncoderClsid(L"image/png", &clsid) >= 0) { // CLSID 사용 (예: Bitmap::Save) // 예: printf("CLSID: {%08lX-%04hX-%04hX-%02X%02X-%02X%02X%02X%02X%02X%02X}\n", // clsid.Data1, clsid.Data2, clsid.Data3, // clsid.Data4[0], clsid.Data4[1], clsid.Data4[2], clsid.Data4[3], // clsid.Data4[4], clsid.Data4[5], clsid.Data4[6], clsid.Data4[7]); } else { // 에러 처리 return -1; } GdiplusShutdown(gdiplusToken); return 0; } }}} {{{+2 기타: 주요 이미지 형식의 CLSID를 동적으로 얻을 필요가 있을까? }}} C++에서 이미지 형식의 CLSID(Class Identifier)를 동적으로 얻는 것은 일반적으로 필요하지 않다, 특히 JPEG, PNG, BMP 등 널리 사용되는 형식의 경우에는 CLSID가 잘 알려져 있고 고정되어 있다. 따라서 상수로 정의된 CLSID를 사용하는 것이 간단하고 효율적이다.