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

时间:2012-08-07 05:07:54

标签: c++ windows winapi

我正在尝试在Windows中获取高分辨率图标或缩略图,给出该文件的完整路径。不需要成为缩略图 - 好看的图标会很棒。我不在乎它是HICON还是HBITMAP:我将把它放在一个GDI +对象中并将其渲染到设备上下文中。

我尝试过使用SHGetFileInfo(在标志上有各种变化),但是从来没有超过一个大约32x32的图标,这可能会大大缩小到我需要的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.
当我使用SHGetFileInfo打电话时,

""会返回SHGFI_ICONLOCATION(这似乎是该API的已知问题)。

我还尝试使用SHCreateItemFromParsingName名称来获取IThumbnailProvider,但BindToHandler始终为E_NOTIMPL返回BHID_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 !!!

我实际上运行了Microsoft Thumbnail Providers Sample并发现它遇到了与BindToInterface相同的问题。

那么,关于我还能尝试什么的任何建议?我只想要一些或多或少代表这个文件的图片,例如,至少100px大小 - 只比32x32更好......

2 个答案:

答案 0 :(得分:7)

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

#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;
}

答案 1 :(得分:1)

您是否尝试过ExtractIconEx()

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

相关问题