2013-10-22 68 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()方法。

相關問題