13

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

4

2 回答 2

20

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

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

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

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

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

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

于 2013-10-22T22:38:41.183 回答
1

在 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")
于 2013-10-22T17:01:09.517 回答