如何获取文件缩略图(C#和C++实现)
创始人
2024-11-15 12:09:18
0

在C++中,可以有以下两种办法

使用COM接口IThumbnailCache

文档链接:IThumbnailCache (thumbcache.h) - Win32 apps | Microsoft Learn

示例代码如下:

VOID GetFileThumbnail(PCWSTR path) {     HRESULT hr = CoInitialize(nullptr);      IShellItem* item = nullptr;     hr = SHCreateItemFromParsingName(path, nullptr, IID_PPV_ARGS(&item));      IThumbnailCache* cache = nullptr;     hr = CoCreateInstance(         CLSID_LocalThumbnailCache,         nullptr,         CLSCTX_INPROC,         IID_PPV_ARGS(&cache));      WTS_CACHEFLAGS flags = WTS_LOWQUALITY;     ISharedBitmap* shared_bitmap;     hr = cache->GetThumbnail(         item,         12*16,         WTS_EXTRACT,         &shared_bitmap,         nullptr,         nullptr);      HBITMAP hbitmap = NULL;     hr = shared_bitmap->GetSharedBitmap(&hbitmap);     shared_bitmap->Release();     cache->Release();     CoUninitialize();      //使用hbitmap,使用完成后调用DeleteObject     DeleteObject(hbitmap);  }

前面我一直使用的这种方式,但是最近系统升级后,会报 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

HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);     HBITMAP hbmp = NULL;      if (SUCCEEDED(hr))     {         IShellItemImageFactory* pImageFactory;         hr = SHCreateItemFromParsingName(path, NULL, IID_PPV_ARGS(&pImageFactory));         if (SUCCEEDED(hr))         {             SIZE size = { 256, 256 };  //图像大小             hr = pImageFactory->GetImage(size, SIIGBF_THUMBNAILONLY, &hbmp);             pImageFactory->Release();         }         CoUninitialize();          //使用hbmp,使用完成后调用DeleteObject         DeleteObject(hbmp);     }

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

PM> NuGet\Install-Package WindowsAPICodePack-Shell -Version 1.1.1

然后用下面的代码就可以获取文件缩略图

ShellFile shellFile = ShellFile.FromFilePath(filepath); Bitmap shellThumb = shellFile.Thumbnail.ExtraLargeBitmap;

相关内容

热门资讯

真的有挂!德普之星的辅助工具介... 真的有挂!德普之星的辅助工具介绍,九九联盟辅助神器,扑克教程(原来真的有挂);相信小伙伴都知道这个九...
真的有挂!wepoker怎么下... 《真的有挂!wepoker怎么下载游戏,欢乐互娱辅助器,技巧教程(一直真的有挂)》 欢乐互娱辅助器软...
真的有挂!德州hhpoker脚... 真的有挂!德州hhpoker脚本,衡阳丫丫字牌辅助,爆料教程(一直真的有挂);超受欢迎的衡阳丫丫字牌...
真的有挂!智星德州插件怎么下载... 真的有挂!智星德州插件怎么下载,闲聚鱼虾蟹软件脚本,高科技教程(果然真的有挂);闲聚鱼虾蟹软件脚本A...
真的是有挂!hhpoker德州... 真的是有挂!hhpoker德州辅助,小程序跑得快的辅助,黑科技教程(果然真的是有挂);小薇(透视辅助...
是有挂的!wepoker私人局... 是有挂的!wepoker私人局有透视吗,欢乐情怀怎么开挂,解密教程(一直是有挂的);欢乐情怀怎么开挂...
真的有挂!aapoker发牌逻... 真的有挂!aapoker发牌逻辑,wepoker内置辅助器,软件教程(一直真的有挂);wepoker...
真的有挂!cloudpoker... 真的有挂!cloudpoker辅助,来趣广西友玩脚本辅助,力荐教程(一贯真的有挂);来趣广西友玩脚本...
是有挂!wepokerplus... 是有挂!wepokerplus透视脚本免费,天天爱柳州辅助,必备教程(果然是有挂);天天爱柳州辅助软...
确实有挂!wepoker有人用... 确实有挂!wepoker有人用过吗,老友辅助器,曝光教程(其实确实有挂);一、老友辅助器AI软件牌型...