如何获取文件缩略图(C#和C++实现)

打印 上一主题 下一主题

主题 595|帖子 595|积分 1785

在C++中,可以有以下两种办法
利用COM接口IThumbnailCache
文档链接:IThumbnailCache (thumbcache.h) - Win32 apps | Microsoft Learn
示例代码如下:

  1. VOID GetFileThumbnail(PCWSTR path)
  2. {
  3.     HRESULT hr = CoInitialize(nullptr);
  4.     IShellItem* item = nullptr;
  5.     hr = SHCreateItemFromParsingName(path, nullptr, IID_PPV_ARGS(&item));
  6.     IThumbnailCache* cache = nullptr;
  7.     hr = CoCreateInstance(
  8.         CLSID_LocalThumbnailCache,
  9.         nullptr,
  10.         CLSCTX_INPROC,
  11.         IID_PPV_ARGS(&cache));
  12.     WTS_CACHEFLAGS flags = WTS_LOWQUALITY;
  13.     ISharedBitmap* shared_bitmap;
  14.     hr = cache->GetThumbnail(
  15.         item,
  16.         12*16,
  17.         WTS_EXTRACT,
  18.         &shared_bitmap,
  19.         nullptr,
  20.         nullptr);
  21.     HBITMAP hbitmap = NULL;
  22.     hr = shared_bitmap->GetSharedBitmap(&hbitmap);
  23.     shared_bitmap->Release();
  24.     cache->Release();
  25.     CoUninitialize();
  26.     //使用hbitmap,使用完成后调用DeleteObject
  27.     DeleteObject(hbitmap);
  28. }
复制代码

前面我不停利用的这种方式,但是最近系统升级后,会报 Generic Error in GDI+ 

背面我升级成了下面这种方式
利用IShellItemImageFactory接口
文档链接:IShellItemImageFactory (shobjidl_core.h) - Win32 apps | Microsoft Learn
官方示例代码:Windows-classic-samples/Samples/Win7Samples/winui/shell/appplatform/UsingImageFactory/ImageFactorySample.cpp at main · microsoft/Windows-classic-samples · GitHub

  1. HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
  2.     HBITMAP hbmp = NULL;
  3.     if (SUCCEEDED(hr))
  4.     {
  5.         IShellItemImageFactory* pImageFactory;
  6.         hr = SHCreateItemFromParsingName(path, NULL, IID_PPV_ARGS(&pImageFactory));
  7.         if (SUCCEEDED(hr))
  8.         {
  9.             SIZE size = { 256, 256 };  //图像大小
  10.             hr = pImageFactory->GetImage(size, SIIGBF_THUMBNAILONLY, &hbmp);
  11.             pImageFactory->Release();
  12.         }
  13.         CoUninitialize();
  14.         //使用hbmp,使用完成后调用DeleteObject
  15.         DeleteObject(hbmp);
  16.     }
复制代码


在C#中利用,可以直接nuget引用  WindowsAPICodePack-Shell  包

  1. PM> NuGet\Install-Package WindowsAPICodePack-Shell -Version 1.1.1
复制代码

然后用下面的代码就可以获取文件缩略图
  1. ShellFile shellFile = ShellFile.FromFilePath(filepath);
  2. Bitmap shellThumb = shellFile.Thumbnail.ExtraLargeBitmap;
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

自由的羽毛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表