如何从文件中获取缩略图

How to get thumbnails from a file

我构建了一个连接技术制图应用程序 (CAD - SolidEdge) 和 ERP 系统的 winform 应用程序。这工作正常,但我无法在 bomstructure 中获得正确的缩略图。

当我单击 Windows (Windows 10) 中的文件时,我看到了一张漂亮的预览图像。如何将此图像提取到我的应用程序中?

我找到了类似的问题和解决方案 (Extract thumbnail for any file in Windows),但这不再有效(因为我猜 Windows 10 次更新)。

还有这个 (C# get thumbnail from file via windows api) doesn't work and gives: Example wrong thumbnail and Example wrong thumbnail.

你们知道如何解决这个问题吗?谢谢!!

可以从 Windows 中检索不同类型的缩略图。

  1. 图片
  2. 歌曲专辑封面
  3. 文档图标
  4. 文件夹
  5. 文件组
  6. 单个项目

Microsoft 有一个很好的示例项目,名为 FileThumbnails,可让您尝试每种类型。此项目于 2020 年 3 月针对 Windows10 和 VS 2019 进行了更新。虽然它是一个通用的 windows 项目而不是 winforms。

在尝试了不同的模式后,我发现您想要的 Solid Edge 文件是 #6。


internal class FileExtensions
{
    public static readonly string[] SEfiles    = new string[] { ".dft", ".par", ".asm" };
}

FileOpenPicker openPicker = new FileOpenPicker();
foreach (string extension in FileExtensions.SEfiles)
{
    openPicker.FileTypeFilter.Add(extension);
}

StorageFile file = await openPicker.PickSingleFileAsync();
if (file != null)
{
    const ThumbnailMode thumbnailMode = ThumbnailMode.SingleItem;

    bool fastThumbnail = FastThumbnailCheckBox.IsChecked.Value;
    ThumbnailOptions thumbnailOptions = ThumbnailOptions.UseCurrentScale;
    if (fastThumbnail)
    {
        thumbnailOptions |= ThumbnailOptions.ReturnOnlyIfCached;
    }

    using (StorageItemThumbnail thumbnail = await file.GetScaledImageAsThumbnailAsync(thumbnailMode, size, thumbnailOptions))
    {
        if (thumbnail != null)
        {
            MainPage.DisplayResult(ThumbnailImage, OutputTextBlock, thumbnailMode.ToString(), size, file, thumbnail, false);
        }
        else
        {
            rootPage.NotifyUser(Errors.NoThumbnail, NotifyType.StatusMessage);
        }
    }
}

public static void DisplayResult(Image image, TextBlock textBlock, string thumbnailModeName, uint size, IStorageItem item, StorageItemThumbnail thumbnail, bool isGroup)
{
    BitmapImage bitmapImage = new BitmapImage();
    bitmapImage.SetSource(thumbnail);
    image.Source = bitmapImage;

    textBlock.Text = String.Format("ThumbnailMode.{0}\n"
                                       + "{1} used: {2}\n"
                                       + "Requested size: {3}\n"
                                       + "Returned size: {4}x{5}",
                                       thumbnailModeName,
                                       isGroup ? "Group" : item.IsOfType(StorageItemTypes.File) ? "File" : "Folder",
                                       item.Name,
                                       size,
                                       thumbnail.OriginalWidth,
                                       thumbnail.OriginalHeight);
    }

结果示例: