提取文件的高分辨率图标或缩略图

我试图在Windows中得到一个高分辨率的图标或缩略图,给出该文件的完整path。 不需要是一个缩略图 – 一个好看的图标将是伟大的。 我不在乎它是一个HICON还是一个HBITMAP :我将它放在一个GDI +对象中,并将其渲染到一个设备上下文中。

我已经尝试使用SHGetFileInfo (标志上的各种变化),但从来没有超过一个〜32×32图标返回,这可怕地缩放到128像素左右,所以我需要。

 if (!SHGetFileInfoW(path, 0, &fi, sizeof(fi), SHGFI_ICON | SHGFI_ICONLARGE | SHGFI_TYPENAME)) return GetLastError(); // fi.hIcon is a valid icon here, but it's horrible quality with // a black mask on it. I want higher quality, and dare I dream of // alpha channel? Mask is acceptable, i suppose. 

当我使用SHGFI_ICONLOCATION (这似乎是该API的已知问题)调用时, SHGetFileInfo返回""

我也尝试使用SHCreateItemFromParsingName名称的意图获取IThumbnailProvider ,但BindToHandler总是返回E_NOTIMPLBHID_ThumbnailHandler

 IShellItem *psi; hr = SHCreateItemFromParsingName(path, NULL, IID_PPV_ARGS(&psi)); if (SUCCEEDED(hr)) { IThumbnailProvider *pThumbProvider; hr = psi->BindToHandler(NULL, BHID_ThumbnailHandler, IID_PPV_ARGS(&pThumbProvider)); if (SUCCEEDED(hr)) { // never get here because hr == E_NOTIMPL !!! 

我实际上运行了微缩略图提供程序示例 ,发现它遭受与BindToInterface相同的问题。

那么,还有什么我可以尝试的build议? 我只是想要一些图片,或多或less代表这个文件,比如说,至less100px的大小 – 只是比32×32更好…

Solutions Collecting From Web of "提取文件的高分辨率图标或缩略图"

如果您的目标是Vista及更高版本,则可以从巨型映像列表中获取256×256图标。 如果您需要定位到XP,则至少可以使用超大图像列表,即48×48(稍好于32×32大)。

 #include <commoncontrols.h> #include <shellapi.h> HICON GetHighResolutionIcon(LPTSTR pszPath) { // Get the image list index of the icon SHFILEINFO sfi; if (!SHGetFileInfo(pszPath, 0, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX)) return NULL; // Get the jumbo image list IImageList *piml; if (FAILED(SHGetImageList(SHIL_JUMBO, IID_PPV_ARGS(&piml))) return NULL; // Extract an icon HICON hico; piml->GetIcon(sfi.iIcon, ILD_TRANSPARENT, &hico); // Clean up piml->Release(); // Return the icon return hico; } 

你尝试过ExtractIconEx()吗?

它具有专用参数来从可执行文件,DLL或图标文件中提取小图标和大图标的数组。 从那里你可以选择最适合你需要的尺寸。 从Win2K开始可以使用API​​调用。