0

我有一个 UWP 应用程序,它可以选择打开图像序列。通常图像序列命名如下:

MyImageSequence_00001.png, MyImageSequence_00002.png, ... MyImageSequence_01024.png, MyImageSequence_01025.png,

通常,这些图像序列将被命名为“UniqueFileName_v06”之类的名称,后面带有“_0004”之类的帧号。在很多情况下,您可以在同一个文件夹中有多个图像序列,但它们将具有不同的前导名称,例如“UniqueFileName_v04_Reflections”或“UniqueFileName_v04_Depth”。起始帧号可以是任何数字,并且帧号将按顺序增加到序列的最后一帧。

我目前让用户手动选择所有文件,如下所示:

        FileOpenPicker filePicker = new FileOpenPicker();
        filePicker.ViewMode = PickerViewMode.List:
        filePicker.FileTypeFilter.Add(".png");
        filePicker.FileTypeFilter.Add(".jpg");
        filePicker.FileTypeFilter.Add(".tif");

        files = await filePicker.PickMultipleFilesAsync();

我希望做的是允许用户通过从文件选择器中的序列中选择单个图像来打开他们的图像序列。因此,如果他们选择“MyImageSequence_00003.png”,应用程序将找到并选择序列中的其余文件(MyImageSequence 00001-01025)并将它们添加到filePickerSelectedFilesArray变量files中。

其次,我想从文件列表中生成一个复合字符串名称。因此,生成一个类似“MyImageSequence_00001-01025”的名称来标识图像序列。

对解决此问题的最佳方法有任何想法吗?似乎我应该使用StorageItemsQuery类之类的东西,但不确定这是否是最好的方法,也不知道如何去做。

感谢您的任何帮助,您可以提供!

我正在使用以下内容来获取不带帧号的图像序列名称:

输入文件路径 C:\Users\Me\Desktop\MyImageSequenceFolder\MyImageSequence_00001.png

string input = Path.GetFileNameWithoutExtension(fileFromImageSequence.Path);
string pattern = @"\d+$";
string replacement = "";
Regex rgx = new Regex(pattern);
string result = rgx.Replace(input, replacement);

sequenceName = result.TrimEnd('_');

sequenceName 输出为“MyImageSequence”

4

1 回答 1

1

目前,原生 UWP 应用程序无法通过路径访问文件(权限限制)。

根据您的描述,图片序列都放在一个文件夹中。那么在通过 选择文件之前FileOpenPicker,我们可以先获得对该文件夹的访问权限,并将其添加到未来访问列表中。

public async Task<StorageFolder> GetImageFolderAsync(string token = "")
{
    StorageFolder folder;
    if (string.IsNullOrEmpty(token))
    {
        var folderPicker = new FolderPicker();
        folderPicker.SuggestedStartLocation = PickerLocationId.Desktop;
        folderPicker.FileTypeFilter.Add("*");
        folder = await folderPicker.PickSingleFolderAsync();
        if (folder != null)
        {
            string folderToken = StorageApplicationPermissions.FutureAccessList.Add(folder);
            // save token to LocalSettings or other location.
            // ...
        }
    }
    else
    {
        folder = await StorageApplicationPermissions.FutureAccessList.GetFolderAsync(token);
    }
    return folder;
}

将文件夹添加到 后FutureAccessList,我们将获得一个 Token。以后我们可以不用打开直接通过Token获取文件夹FolderPicker。这相当于用户授权应用程序访问该文件夹。

然后,当用户通过 选择文件时FileOpenPicker,可以通过上述方法获取文件夹,并根据您设置的规则(如StorageItemsQuery)在文件夹中找到相同类型的图像序列。

public async Task<IReadOnlyList<StorageFile>> SearchSameImages(StorageFile fileFromImageSequence)
{
    string input = Path.GetFileNameWithoutExtension(fileFromImageSequence.Path);
    string pattern = @"\d+$";
    string replacement = "";
    Regex rgx = new Regex(pattern);
    string result = rgx.Replace(input, replacement);
    sequenceName = result.TrimEnd('_');

    var queryOptions = new QueryOptions();
    queryOptions.ApplicationSearchFilter = $"\"{sequenceName}\"";
    string token = GetToken(); // From LocalSettings or other place.
    var folder = await GetImageFolderAsync(token);

    var queryResult = folder.CreateFileQueryWithOptions(queryOptions);
    var files = await queryResult.GetFilesAsync();
    return files;
}

这样,您可以在应用程序第一次启动时要求用户指定一个文件夹来存储图片序列,并在之后保留对该文件夹的访问权限。使用上面提供的方法,基于单个文件查询文件夹中的图片顺序。

谢谢。

于 2020-06-24T00:36:16.127 回答