如何在 Pi 上显示来自 USB 的随机图像

How to display random image from USB on a Pi

我已经成功创建了我的第一个物联网项目,并且可以通过按下 Raspberry Pi2 上的按钮来加载图像。

我试图将代码放在一起,以便从一组图像中随机获取一张图像,但我有几个地方不对劲。

1) 我不知道如何从 Pi 扫描 U 盘

2) 我似乎无法从文件中加载图像,只能从嵌入式资源中加载图像。

3) 我似乎不知道如何关闭该应用程序,我原以为 App.exit 会这样做,但似乎没有。

基本上我只是在玩,我认为一个很好的学习项目是创建一个随机显示 USB 记忆棒中的图像的数码相框,它对我来说一点也不顺利。

如果我能让它在按下按钮时工作,我应该能够放入一个计时器并很容易地让它一直运行。

这是我的代码,您可以从我注释掉的部分中看到我尝试过的内容:

' The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409
''' <summary>
''' An empty page that can be used on its own or navigated to within a Frame.
''' </summary>

Public NotInheritable Class MainPage
    Inherits Page
    Dim random As Random = New Random()

    Private Sub ClickMe_Click(sender As Object, e As RoutedEventArgs)
        'Dim DirectoryPath As String = "F:/VB.Net files/Images/"
        'Dim finfo As FileInfo = New FileInfo(GetRandomImageFilePath(DirectoryPath))
        'Dim filename As String = finfo.Name.Replace(finfo.Extension, "")
        'BBPLogo.Source = New BitmapImage(New Uri("file:///" & finfo.FullName, UriKind.Relative))
        BBPLogo.Source = New BitmapImage(New Uri("ms-appx:///Assets/Bowral-Bricks.png", UriKind.Absolute))
    End Sub

    Private Sub ExitButton_Click(sender As Object, e As RoutedEventArgs) Handles ExitButton.Click

    End Sub

    Public Function GetRandomImageFilePath(ByVal folderPath As String) As String
        Dim files() As String = Directory.GetFiles(folderPath, "*.png")
        Return files(random.Next(0, files.Length))
    End Function

End Class

不确定您是否需要它,但这是 xaml

<Page
    x:Class="PiTest01.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:PiTest01"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" Height="480" Width="800">

    <Grid>
        <Grid.Background>
            <ImageBrush Stretch="Fill"/>
        </Grid.Background>
        <Image x:Name="BBPLogo" HorizontalAlignment="Left" Height="480" VerticalAlignment="Top" Width="800" RenderTransformOrigin="1.163,0.596" Stretch="UniformToFill"/>
        <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Margin="78,18,436,164" Height="178">
            <Button x:Name="ClickMe" Content="Click Me!"  Margin="10" HorizontalAlignment="Center" Click="ClickMe_Click"/>
            <Button x:Name="ExitButton" Content="Exit" HorizontalAlignment="Left" VerticalAlignment="Bottom" Width="126"/>
        </StackPanel>
    </Grid>
</Page>

我已经在我的 Raspberry Pi 上测试了以下内容,所以理论上这一切都是可行的。

(1) 在 U 盘上查找图像文件

首先,您需要将 "Removable Storage" 功能添加到您的应用程序:打开 Package.appxmanifest,导航到“功能”选项卡,并确保选中 "Removable Storage"。这将允许您的应用程序访问 USB 驱动器上的文件。其次,通用应用程序只能 enumerate/read/modify 已在 "File Type Associations" 下的清单中明确声明的文件类型。再次打开 Package.appxmanifest,导航到 Declarations 选项卡,select "File Type Associations",然后点击 Add。您现在需要根据您的应用要支持的文件类型填写右侧窗格中的字段:可以找到详细信息 on MSDN.

然后您可以像 these examples 中那样枚举可移动驱动器及其 sub-files/folders。例如,要枚举顶级文件(C#,抱歉):

var drives = await Windows.Storage.KnownFolders.RemovableDevices.GetItemsAsync();

foreach (var drive in drives)
{
    var files = await drive.GetFilesAsync();
}

另请记住,只有子文件夹和明确关联的文件类型会显示。

(2) 从文件加载图像

It is not possible to load a file directly from a file:// URI。相反,您需要通过 StorageFile 和流,例如:

var file = await StorageFile.GetFileFromPathAsync(@"E:\test.png");

using (var stream = await file.OpenAsync(FileAccessMode.Read))
{
    var bmp = new BitmapImage();
    await bmp.SetSourceAsync(stream);
    ImageControl.Source = bmp;
}

(3) 退出应用程序

App.Current.Exit(); 似乎对我有用,退出应用程序并奇怪地显示 "Please wait while we set up your device" 进度微调器,它显然仍然潜伏在后面。