Я пытаюсь получить миниатюру файла в 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, хорошо.