当前位置: 首页 > news >正文

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

在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,使用完成后调用DeleteObjectDeleteObject(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,使用完成后调用DeleteObjectDeleteObject(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;
http://www.lryc.cn/news/409762.html

相关文章:

  • create-vue项目的README中文版
  • Centos 7系统(最小化安装)安装Git 、git-man帮助、补全git命令-详细文章
  • Golang零基础入门课_20240726 课程笔记
  • 杂记-镜像
  • 如何将WordPress文章中的外链图片批量导入到本地
  • primetime如何合并不同modes的libs到一个lib文件
  • 【运维笔记】数据库无法启动,数据库炸后备份恢复数据
  • 成功解决:java.security.InvalidKeyException: Illegal key size
  • 微服务事务管理(分布式事务问题 理论基础 初识Seata XA模式 AT模式 )
  • 测试面试宝典(三十五)—— fiddler的工作原理
  • 旷野之间32 - OpenAI 拉开了人工智能竞赛的序幕,而Meta 将会赢得胜利
  • 机械学习—零基础学习日志(高数15——函数极限性质)
  • 树 形 DP (dnf序)
  • React的生命周期?
  • c# - - - ASP.NET Core 网页样式丢失,样式不对
  • Cannot find module ‘html-webpack-plugin
  • vue、react部署项目的 hashRouter 和 historyRouter模式
  • Qt 实现抽屉效果
  • windows上启动Kafka
  • 贪心系列专题篇三
  • Java中两个集合取差集
  • flask mysql数据迁移
  • Kylin系列(一)入门
  • pmp学习交流组队~
  • 公司常用的监控软件有哪些?2024年六大公司监控软件良心推荐!
  • DNS解析异常--排查验证
  • OpenCV库学习之Canny边缘检测模块
  • Python 教程(七):match...case 模式匹配
  • Python小项目实战:杨辉三角
  • java注解与反射(非常详细, 带有很多样例)