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

标签 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.
当我使用 SHGFI_ICONLOCATION 调用时,

SHGetFileInfo 返回 ""(这似乎是该 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 相同的问题。

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

最佳答案

如果您的目标是 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;
}

关于c++ - 提取文件的高分辨率图标或缩略图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11839588/

相关文章:

windows - Apache Httpd.conf 相对路径

c++ - C++中的浏览器帮助对象

google-chrome - 使用 Chromium 嵌入式框架覆盖鼠标

php - 如何在Windows服务器上使用php将声音文件转换为其他格式?

c++ - EnumChildWindows 和 lambda

c++ - 使用 Eigen 时的奇怪行为

c++ - 我如何使用 NPAPI 从 JavaScript 调用 C++ 代码

c++ - 在 C++ 中设置编码的最正确方法是什么?

c++ - 将 std::begin() 应用于 unique_ptr 中动态分配的数组?

c++ - 如何创建错误以便 GetLastError 返回错误?