Я пытаюсь получить миниатюру файла в Windows API. Я нашел способ, но для примера кода требуется минимальная версия Windows версии 8, я бы предпочел способ, который работает как минимум в 7 или Vista, желательно в XP. Если есть независимый от платформы способ получения эскиза, я бы предпочел сделать это, но я не смог его найти.
Как получить миниатюру файла с помощью Windows API?
Ответ 1
Единого API, который работает во всех версиях Windows, не существует, потому что Microsoft продолжает изменять API-интерфейсы эскизов с одной версии Windows на другую.
На Win2K вплоть до Vista и не включая более поздние версии вы можете получить IShellFolder
для родительской папки файла, используя SHGetDesktopFolder()
и IShellFolder::ParseDisplayName()
(или SHParseDisplayName()
в XP и более поздних версиях), затем используйте IShellFolder::GetUIObjectOf()
для извлечения интерфейса дочернего файла IExtractImage
, а затем вызвать его GetLocation()
чтобы установить размер изображения и его метод Extract()
для получения фактического изображения.
В Vista и позже вы можете:
1) используйте IThumbnailProvider
. IInitializeWith...
его для одного из своих интерфейсов IInitializeWith...
( IInitializeWithStream
, IInitializeWithItem
или IInitializeWithFile
), чтобы сообщить ему, какой файл вам интересен, а затем вызвать его GetThumbnail()
для получения фактического изображения. Кроме того, вы можете получить IShellItem
для нужного файла, а затем вызвать его метод BindToHandler
для получения файла IThumbnailProvider
.
2) используйте IThumbnailCache
. Передайте IShellItem
представляющий желаемый файл, GetThumbnail()
чтобы получить изображение.
3) используйте IShellItemImageFactory
. Используйте одну из SHCreateItemFrom...()
( SHCreateItemFromIDList()
, SHCreateItemFromParsingName()
, SHCreateItemFromRelativeName()
, SHCreateItemInKnownFolder()
, SHCreateItemWithParent()
), чтобы получить этот интерфейс для данного файла, а затем вызвать его GetImage()
.
Ответ 2
Использование powershell в системе 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")
Ответ 3
Это лучшее, что я смог найти: http://msdn.microsoft.com/en-us/library/windows/desktop/bb774628(v=vs.85).aspx
Серьезно, это должно было быть доступно, по крайней мере, в XP, хорошо.