首页 > 编程语言 >如何获取文件缩略图(C#和C++实现)

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

时间:2024-07-29 13:55:37浏览次数:16  
标签:缩略图 C# cache nullptr C++ bitmap hr hbitmap shared

在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;

标签:缩略图,C#,cache,nullptr,C++,bitmap,hr,hbitmap,shared
From: https://blog.csdn.net/zhaotianff/article/details/140769502

相关文章

  • 【基础篇】Docker 架构与组件 TWO
    嗨,小伙伴们!我是小竹笋,一名热爱创作的工程师。上一篇我们聊了聊Docker的历史与发展、与虚拟机的对比以及它在行业中的应用。今天,让我们更进一步,深入探讨Docker的架构与关键组件。欢迎订阅公众号:JAVA和人工智能......
  • hackme-1靶机
    目录扫描发现该网址存放上传文件注册一个账户,点击搜索验证是否存在sql注入漏洞WindowsOS'and1=1#WindowsOS'and1=2#存在sql注入漏洞 判断列数WindowsOS'orderby3#WindowsOS'orderby4#所以,有3列;判断回显位置-1'unionselect1,2,3#查看当......
  • C语言中的函数(保姆级详细讲解)
    文章目录一.函数的概念1.1库函数1.2自定义函数二.函数的参数1.实参2.形参3.形参和实参的关系(传值调用)4.数组做函数参数(传址调用)三.函数的return语句四.函数的嵌套调用和链式访问1.嵌套调用2.链式访问五.static和extern1.作用域和生命周期2.static2.1s......
  • rsync
    rsync服务简介服务端:192.168.1.10客户端:192.168.1.20任务:将192.168.1.20的/mnt/rhd/bak/目录拷贝到192.168.1.10的/mnt/rhd1/目录下服务端安装yum-yinstallrsync配置cat/etc/rsyncd.conf|egrep-v"^#|^$"uid=rootgid=rootusechroot=nomaxconnect......
  • windows编译ZLMediaKit流媒体服务webrtc
    环境说明ZLMediaKit编译需要的软件visualstudio 2022cmake 3.29.0-rc2OpenSSL 1.1.1w(不想踩坑的话安装这个版本)libsrtp 2.6.0ZLMediaKit编译后运行需要libsrtp 编译后且配置环境变量ZLMediaKit 编译后文件cmakevisualstuido20222,自带cmakecmake可以到这两个地方......
  • 使用 pgvector 和 Lambda 生成基岩嵌入并存储在 Aurora 中
    我在Aurora中的不同表中有一些数据,我想对其执行RAG。为此,我创建了一个微服务(Lambda),它可以生成不同表的嵌入并将该数据存储在Aurora中。但是矢量更新插入应该基于某些数据库流集合。例如:如果有5个以上的数据库更新,那么我应该重新生成嵌入,并且应该有一个端点,我可以在其中......
  • 免费版ChatGPT API Key生成指南
    当下,虽然ChatGPT已经免费开放使用,但要想在互联网上畅通无阻,仍有一些繁琐步骤。虽然网络上有许多提供GPT服务的网站,但若想自行开发应用,则需要获取一个API密钥。你可以在这个项目地址查看详细信息:https://github.com/baicaigpt/FreeGPT_FreeApiKey。在该地址,你可以直接了解如何申请......
  • 切换颜色和符号 scattermapbox -plotly dash
    我试图包含两个单独的开关来改变散点图框的颜色和符号。颜色切换工作正常,而符号切换工作时,它会丢弃颜色。我希望能够同时打开符号和颜色。可以吗?注意:需要是scattermapboximportdashfromdashimportDash,dcc,html,Input,Outputimportplotly.expressasp......
  • LeetCode LCR 124.推理二叉树(哈希表 + 建树)
    某二叉树的先序遍历结果记录于整数数组 preorder,它的中序遍历结果记录于整数数组 inorder。请根据 preorder 和 inorder 的提示构造出这棵二叉树并返回其根节点。注意:preorder 和 inorder 中均不含重复数字。示例1:输入:preorder=[3,9,20,15,7],inorder=......
  • 从零开始学嵌入式技术之C语言04:进制与转换
    一:进制        计算机世界中只有二进制,所以计算机中存储和运算的所有数据都要转为二进制。包括数字、字符、图片、声音、视频等。(1)二进制:0、1,满2进1。(2)十进制:0-9,满10进1。(3)十六进制:0-9及A-F,满16进1。十六进制中,除了0到9十个数字外,还引入了字母,以便表示超过......