2012-08-07 109 views
10

我试图在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_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 !!! 

其实我已经运行微软Thumbnail Providers Sample,发现它患有与BindToInterface相同的问题。

那么,我还有什么可以尝试的建议吗?我只是想要一些图片-y,或多或少代表这个文件,比如至少100px的大小 - 只是比32x32更好...

+1

如果自定义文件的开发人员只提供32x32图标会怎么样?你从哪里得到更大的图像?想想这个。 – Apokal 2012-08-07 09:02:26

+0

谢谢@Apokal,无论我能得到什么,我都很开心。如果一个应用程序只有小图标,我会采取的,但我知道有像文本文件,办公文档等东西非常大的图标。我想尽我所能为那些... – MarcWan 2012-08-09 04:36:05

回答

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; 
} 
+0

嗨雷蒙德,谢谢。这几乎是我想要的。 – MarcWan 2012-09-18 04:00:54

+3

一个问题:如果图像只有32x32,那么该功能仍然会返回一个256x256的图像,只需在左上角显示图标即可。有什么方法可以确定是否没有巨型图标,让我回到其他代码?谢谢! – MarcWan 2012-09-18 04:01:51

+0

尝试了它并覆盖实际上应用,但图标是4位与黑色背景。 – jnm2 2017-07-21 21:35:56

1

你试过ExtractIconEx()

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

+0

我相信ExtractIconEx只会从32x32大的时代获得标准的小型和“大型”图标。 – 2012-09-14 20:03:33

+0

@AdrianMcCarthy我试了一下,你是正确的。 32x32是我能找到的最大的。 – U007D 2012-09-17 01:21:13

+0

一直在读这个,但它看起来好像在48x48最大,我不知道图标索引 - 我只知道文件类型。是否有某种全面的解决方案可以为我带来100像素的图像? – MarcWan 2012-09-17 14:25:48