13

そのファイルへの完全なパスを指定して、Windows で高解像度のアイコンまたはサムネイルを取得しようとしています。サムネイルである必要はありません— 見栄えの良いアイコンは素晴らしいものです。かどうかは気にしませんHICONHBITMAPこれを GDI+ オブジェクトに入れて、デバイス コンテキストにレンダリングします。

私はSHGetFileInfo(フラグのさまざまなバリエーションで)使用してみましたが、必要な128ピクセルに恐ろしくスケーリングする〜32x32以上のアイコンを取得することはありません。

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また、取得するつもりで name を使用してみまし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 !!!

Microsoft Thumbnail Providers Sampleを実際に実行したところ、BindToInterface.

それで、他に何を試すことができるかについての提案はありますか?多かれ少なかれ、このファイルを少なくとも 100px のサイズで表す画像のようなものが欲しいだけです — 32x32 よりも良いもの...

4

2 に答える 2

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;
}
于 2012-09-14T17:14:27.627 に答える
1

ExtractIconEx()を試しましたか?

実行可能ファイル、DLL、またはアイコン ファイルから小さいアイコンと大きいアイコンの両方の配列を抽出する専用のパラメーターがあります。そこから、ニーズに最適なサイズを選択できます。API 呼び出しは Win2K 以降で利用できます。

于 2012-09-14T03:11:46.153 に答える