【问题标题】:How to get thumbnail of file using the Windows API?如何使用 Windows API 获取文件的缩略图?
【发布时间】:2013-10-31 15:52:43
【问题描述】:

我正在尝试在 Windows API 中获取文件的缩略图。我确实找到了一种方法,但代码示例至少需要 Windows 8 版本,我更喜欢至少在 7 或 Vista 中工作的方法,最好是在 XP 中。如果有一种独立于平台的方式来获取缩略图,我更愿意这样做,但我一直找不到。

【问题讨论】:

标签: winapi thumbnails


【解决方案1】:

没有适用于所有 Windows 版本的单一 API,因为 Microsoft 不断将缩略图 API 从一个 Windows 版本更改为另一个。

在 Win2K 及包括 Vista(不确定更高版本)上,您可以使用 SHGetDesktopFolder()IShellFolder::ParseDisplayName()(或在 XP 及更高版本上为 SHParseDisplayName())检索文件父文件夹的 IShellFolder,然后使用IShellFolder::GetUIObjectOf()获取所需子文件的IExtractImage接口,然后调用其GetLocation()方法设置图片大小,调用Extract()方法获取实际图片。

在 Vista 及更高版本上,您可以:

1) 使用IThumbnailProvider。查询它的IInitializeWith... 接口之一(IInitializeWithStreamIInitializeWithItemIInitializeWithFile)告诉它您对哪个文件感兴趣,然后调用它的GetThumbnail() 方法来获取实际图像。或者,您可以获取所需文件的IShellItem,然后调用其BindToHandler 方法来获取文件的IThumbnailProvider

2) 使用IThumbnailCache。将代表所需文件的IShellItem 传递给其GetThumbnail() 方法以获取图像。

3) 使用IShellItemImageFactory。使用SHCreateItemFrom...() 函数之一(SHCreateItemFromIDList()SHCreateItemFromParsingName()SHCreateItemFromRelativeName()SHCreateItemInKnownFolder()SHCreateItemWithParent())为给定文件获取此接口,然后调用其GetImage() 方法。

【讨论】:

    【解决方案2】:

    在 Win 7 系统上使用

    PS> $myimage = [System.Drawing.Image]::FromFile("c:\image.jpg");
    PS> $mythumb = $myimage.GetThumbnailImage(72, 72, $null, [intptr]::Zero);
    PS> $mythumb.Save("c:\thumb.jpg")
    

    【讨论】:

    • 这不行,因为它会获取整个图像,缩略图缓存的重点主要是性能。
    • @DudeDawg 根据this,如果存在则获取缩略图:"如果Image包含嵌入的缩略图图像,则此方法检索嵌入的缩略图并将其缩放到请求的大小。如果 Image 不包含嵌入的缩略图图像,则此方法通过缩放主图像来创建缩略图图像。"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 2015-02-03
    • 2020-08-03
    • 2015-01-22
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    相关资源
    最近更新 更多