我正在尝试在 Windows API 中获取文件的缩略图。我确实找到了一种方法,但代码示例至少需要 Windows 8 版本,我更喜欢至少在 7 或 Vista 中工作的方法,最好是在 XP 中。如果有一种独立于平台的方式来获取缩略图,我更愿意这样做,但我一直找不到。
2 回答
没有适用于所有 Windows 版本的单一 API,因为 Microsoft 不断将缩略图 API 从一个 Windows 版本更改为另一个。
在 Win2K 及包括 Vista (不确定更高版本)上,您可以使用and (或在 XP 及更高版本上)检索IShellFolder
文件的父文件夹,然后使用检索所需子文件的接口,然后调用其方法设置图像大小及其检索实际图像的方法。SHGetDesktopFolder()
IShellFolder::ParseDisplayName()
SHParseDisplayName()
IShellFolder::GetUIObjectOf()
IExtractImage
GetLocation()
Extract()
在 Vista 及更高版本上,您可以:
1)使用IThumbnailProvider
。查询它的IInitializeWith...
接口之一(IInitializeWithStream
、IInitializeWithItem
或IInitializeWithFile
),告诉它您对哪个文件感兴趣,然后调用它的GetThumbnail()
方法来获取实际图像。或者,您可以获取IShellItem
所需文件的一个,然后调用其BindToHandler
方法来获取该文件的IThumbnailProvider
.
2)使用IThumbnailCache
。将IShellItem
代表所需文件传递给其GetThumbnail()
方法以获取图像。
3)使用IShellItemImageFactory
。使用SHCreateItemFrom...()
函数之一 ( SHCreateItemFromIDList()
, SHCreateItemFromParsingName()
, SHCreateItemFromRelativeName()
, SHCreateItemInKnownFolder()
, SHCreateItemWithParent()
) 为给定文件获取此接口,然后调用其GetImage()
方法。
在 Win 7 系统上使用powershell :
PS> $myimage = [System.Drawing.Image]::FromFile("c:\image.jpg");
PS> $mythumb = $myimage.GetThumbnailImage(72, 72, $null, [intptr]::Zero);
PS> $mythumb.Save("c:\thumb.jpg")