2013-10-22 64 views
7

我试图在Windows API中获取文件的缩略图。我确实找到了一种方法,但代码示例要求Windows 8最低版本,我宁愿选择至少适用于7或Vista的方式,最好在XP中。如果有一种独立于平台的获取缩略图的方式,我宁愿这样做,但我一直无法找到它。如何使用Windows API获取文件的缩略图?

+0

[C#通过windows api从文件中获取缩略图]可能的重复(http://stackoverflow.com/questions/1439719/c-sharp-get-thumbnail-from-file-via-windows-api) – SLaks

+2

不,这不是重复的,我问一个关于Windows API的问题,而不是.net API。或者你是否告诉我,我可以使用.net api从一个正常的Windows客户端程序,在这种情况下解释如何。 –

+0

.Net API是底层Windows API的一个包装。 – SLaks

回答

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") 
+1

由于它获取整个图像,所以不会这样做,具有缩略图缓存的点主要是性能。 –

+0

@DudeDawg根据[this](http://msdn.microsoft.com/en-us/library/system.drawing.image.getthumbnailimage。如果它存在缩略图:_“如果图像包含嵌入的缩略图图像,则此方法将检索嵌入的缩略图并将其缩放到所需的大小。如果图像不包含嵌入的缩略图图像,则此方法通过缩放主图像来创建缩略图图像。“_ – David

8

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

在Win2k直至并包括Vista(不知道以后的版本),你可以检索使用SHGetDesktopFolder()IShellFolder::ParseDisplayName()(或SHParseDisplayName()在XP及更高版本)文件的父文件夹,然后用IShellFolder::GetUIObjectOf()检索所需孩子的IShellFolder文件的IExtractImage接口,然后调用其GetLocation()方法设置图像大小及其Extract()方法来检索实际图像。

在Vista和更高版本,您可以:

1)使用IThumbnailProvider。查询它的IInitializeWith...接口之一(IInitializeWithStream,IInitializeWithItemIInitializeWithFile)告诉它你感兴趣的文件,然后调用它的GetThumbnail()方法来获取实际图像。或者,您可以获得所需文件的IShellItem,然后调用其BindToHandler方法来获取文件的IThumbnailProvider。使用IThumbnailCache。将代表所需文件的IShellItem传递给其GetThumbnail()方法以获取图像。使用IShellItemImageFactory。使用SHCreateItemFrom...()函数之一(SHCreateItemFromIDList(),SHCreateItemFromParsingName(), SHCreateItemFromRelativeName(), SHCreateItemInKnownFolder(),SHCreateItemWithParent())为给定文件获取此接口,然后调用它的GetImage()方法。

相关问题