CLSID BitmapUtil::FindCodecForExtension( LPCTSTR pszExtension, const Gdiplus::ImageCodecInfo* pCodecs, UINT nCodecs ) { CT2CW pszExtensionW( pszExtension ); for( UINT iCodec = 0; iCodec < nCodecs; iCodec++ ) { CStringW strExtensions( pCodecs[iCodec].FilenameExtension ); int iStart = 0; do { CStringW strExtension = ::PathFindExtensionW( strExtensions.Tokenize( L";", iStart ) ); if( iStart != -1 ) { if( strExtension.CompareNoCase( pszExtensionW ) == 0 ) { return( pCodecs[iCodec].Clsid ); } } } while( iStart != -1 ); } return( CLSID_NULL ); }
// Check if file name has a supported image type extension. bool CMyStatic::IsSupportedFileExtension(LPCTSTR lpszFileName) const { bool bIsSupportedFileExtension = false; LPCTSTR lpszExt = ::PathFindExtension(lpszFileName); if (_T('.') == *lpszExt) { #if 1 ++lpszExt; static LPCTSTR lpszExtensions[] = { _T("bmp"), _T("dib"), _T("rle"), _T("jpg"), _T("jpeg"), _T("jpe"), _T("jfif"), _T("gif"), _T("tif"), _T("tiff"), _T("png"), _T("ico") }; int i = 0; while (!bIsSupportedFileExtension && lpszExtensions[i]) { if (0 == _tcsicmp(lpszExt, lpszExtensions[i])) bIsSupportedFileExtension = true; ++i; } #else // Check file name extension against those of supported GDI+ codecs. // Based on code form atlimage.h. // Note that this check does not include .ico files which are supported for loading. ULONG_PTR gdiplusToken; Gdiplus::GdiplusStartupInput input; if (Gdiplus::Ok == Gdiplus::GdiplusStartup(&gdiplusToken, &input, NULL)) { UINT nEncoders; UINT nBytes; if (Gdiplus::Ok == Gdiplus::GetImageEncodersSize(&nEncoders, &nBytes)) { LPBYTE pBuf = new BYTE[nBytes]; Gdiplus::ImageCodecInfo* pEncoders = reinterpret_cast<Gdiplus::ImageCodecInfo*>(pBuf); if (Gdiplus::Ok == Gdiplus::GetImageEncoders(nEncoders, nBytes, pEncoders)) { CStringW strExtW(lpszExt); for (UINT iCodec = 0; iCodec < nEncoders && !bIsSupportedFileExtension; iCodec++) { CStringW strExtensions(pEncoders[iCodec].FilenameExtension); int iStart = 0; do { CStringW strExtension = ::PathFindExtensionW(strExtensions.Tokenize(L";", iStart)); if (iStart != -1 && 0 == strExtension.CompareNoCase(strExtW.GetString())) { bIsSupportedFileExtension = true; } } while (iStart != -1 && !bIsSupportedFileExtension); } } delete [] pBuf; } Gdiplus::GdiplusShutdown(gdiplusToken); } #endif } return bIsSupportedFileExtension; }