Как получить миниатюру файла с помощью Windows API?

Я пытаюсь получить миниатюру файла в Windows API. Я нашел способ, но для примера кода требуется минимальная версия Windows версии 8, я бы предпочел способ, который работает как минимум в 7 или Vista, желательно в XP. Если есть независимый от платформы способ получения эскиза, я бы предпочел сделать это, но я не смог его найти.

Ответ 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

Использование в системе 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")