【问题标题】:How to load an image from a file in c# in the UWP format如何从 C# 中的 UWP 格式的文件中加载图像
【发布时间】:2019-02-05 19:58:51
【问题描述】:

我是一名前 IT 专业人士,使用各种软件进行了大量数据库编程,使用各种编程语言,从 PL/1 和 Pascal 到最新的 Python。我正在尝试在 UWP 环境中学习 c#,以期可能编写一些混合现实应用程序。是的,我知道我有野心......因为现在它根本不起作用!哈哈!

我给自己做了一个“简单”的小项目,开始摆弄课程和学习软件。这是一个使用 .Net 框架的 c# 简单幻灯片软件,因为我希望能够在混合现实和 2D 应用程序中使用它。我已经在 Python 中对此进行了编程,因此我正在尝试将其移植到 c#(我知道它不是直接端口……天哪……)。天哪,在我完成的大量谷歌搜索中,我找不到任何像样的教程或代码。很多在没有 .Net 的 c# 中,很多在其他语言中,但不是在我尝试使用的环境中。

所以!我已经在 Visual Studio 2017 中使用空白 UWP 应用程序创建了我的应用程序。我正在使用工具箱中的“图像”并将其放在我的屏幕上,创建了一个 AppBarButton 来放置我的控件。我创建了(使用其他示例)一个选择器,该选择器返回一个存储文件以选择一个 jpg 文件,并且能够将名称放在我在同一屏幕上创建的文本框中。

但是!!!

经过几个小时的摆弄,我找不到如何在我用 XAML 创建的这个“图像”中加载图像。此外,我还想对这张图片进行操作、缩放、旋转,但我不知道该往哪里看。最后,如果有人能指点我如何从目录中读取整个文件列表以及如何使用 Zip 文件,我们将不胜感激。

如果你有代码,我会通读它,或者如果你有我应该做的教程,请提出!但是,作为一名经验丰富的 IT 人员,我正在寻找中肯的说明。我曾尝试查看 Microsoft C# 教程,但对俗气的笑话和缓慢的节奏失去了耐心......而且我是一个非常有耐心的人......

作为参考,我在这里包含了我现在所在位置的 XAML 和 C# 代码。经过这么多年的编程,感觉就像一个孩子学会说话,真是令人沮丧!哈哈!

XAML 部分:

<Page.BottomAppBar>
    <CommandBar>
        <CommandBar.Content>
            <Grid/>
        </CommandBar.Content>
        <AppBarButton Icon="OpenFile" Label="AppBarButton" Tapped="Loadmedia"/>
        <AppBarButton Icon="Next" Label="AppBarButton"/>
    </CommandBar>
</Page.BottomAppBar>

<Grid>
    <TextBox x:Name="outtext" HorizontalAlignment="Left" VerticalAlignment="Bottom" Height="73" Width="1343" Margin="315,0,0,10"/>
    <Image x:Name="mypic" HorizontalAlignment="Left" Height="765" Margin="48,45,0,0" VerticalAlignment="Top" Width="1783" FocusVisualPrimaryBrush="Black"/>
</Grid>
</Page>

这是 C# 代码:

    public MainPage()
    {
        this.InitializeComponent();
    }

    private async void Loadmedia(object sender, TappedRoutedEventArgs e)
    {
        var picker = new FileOpenPicker();
        Image img = sender as Image;

        picker.ViewMode = PickerViewMode.Thumbnail;

        picker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;

        picker.FileTypeFilter.Add(".jpg");

        StorageFile file = await picker.PickSingleFileAsync();

        outtext.Text = file.Path;

        mypic.UriSource = new BitmapImage(new Uri(file.Path));



    }

}

【问题讨论】:

  • 尝试使用 mypic.Source 而不是 mypic.UriSource
  • 谢谢奥尔曼,我也试过了。到目前为止,我发现您无法从计算机加载任何图片,它必须是应用程序资源的一部分。我成功加载了作为资源一部分的图片......我可能需要另一个对象而不是 Image...... Canvas?我不知道……。

标签: c# image uwp slideshow


【解决方案1】:

使用 SetSourceAsync 设置 BitmapImage 的源以及从 StorageFile 打开的流,而不是仅使用 StorageFile 的路径。应用无权直接访问Path,需要通过StorageFile通过file broker。

BitmapSource.SetSourceAsync documentation 中有一个示例代码 sn-p,一旦修改为您的变量名,它基本上看起来像这样:

// Ensure the stream is disposed once the image is loaded
using (IRandomAccessStream fileStream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read))
{
     // Set the image source to the selected bitmap
     BitmapImage bitmapImage = new BitmapImage();
     // Decode pixel sizes are optional
     // It's generally a good optimisation to decode to match the size you'll display
     bitmapImage.DecodePixelHeight = decodePixelHeight;
     bitmapImage.DecodePixelWidth = decodePixelWidth;

     await bitmapImage.SetSourceAsync(fileStream);
     mypic.Source = bitmapImage;
}

查看Simple Imaging sampleBasic input sample 以了解旋转、缩放等示例。

【讨论】:

  • 我真的不确定我在做什么,但它正在工作!明天贴代码。非常感谢罗布。会详细看这个了解一下!
  • 唯一不起作用的是“decodePixelHeight”。我得到“在当前上下文中不存在”。改为“(int)myimg.Height”......在这个例子中,“decodePixelHeight”需要是实际的图像对象高度,对吗?
  • 对。将其定义为适合您的应用程序的任何内容,或者如果您需要完整尺寸的图像,请删除该代码。基本概念是,如果您只是要显示缩略图,您不想以全尺寸打开高分辨率图像 - 这将无用地使用大量内存。你可以告诉解码器一个更小的尺寸,当它读入时它会缩小它。如果你的应用程序是一个照片编辑器,那么你可能希望以全尺寸加载要编辑的照片,即使它不适合全部一下屏幕。管理非常大的图像可能需要更复杂的方案。
  • 非常感谢罗伯!现在给你另一个转折点。我的图像没有以正确的颜色配置文件显示......它们全都是绿色的,因为我正在使用 Photoshop 编辑它们......有什么方法可以改变这个吗?
  • 你应该可以。我会创建一个包含新问题详细信息的新问题
猜你喜欢
  • 1970-01-01
  • 2015-10-09
  • 2021-08-06
  • 2017-12-03
  • 1970-01-01
  • 2022-01-21
  • 2016-06-17
  • 1970-01-01
相关资源
最近更新 更多