2012-08-07 115 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