如何在 Raspberry Pi 上从 USB 随机显示图片

3
我已经成功创建了我的第一个物联网项目,并可以在按下树莓派2上的按钮时加载图像。
我试图编写代码从一组图像中获取随机图像,但我有几个问题。
1)我不知道如何从树莓派扫描USB驱动器。
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>

2
如果您要投下反对票,请礼貌地说明原因,这样我就可以进行修正。这里有注释的代码展示了我的研究成果,并且非常清楚地表明了我的意图。 - Dan Donoghue
1个回答

2
我已经在我的树莓派上测试了以下内容,理论上它是可行的。
(1)查找USB驱动器上的图像文件
首先,您需要将“可移动存储”功能添加到您的应用程序中:打开Package.appxmanifest,导航到Capabilities选项卡,并确保选中了“可移动存储”。这将允许您的应用程序访问USB驱动器上的文件。其次,通用应用程序只能枚举/读取/修改已在清单中明确声明为“文件类型关联”的文件类型。再次打开Package.appxmanifest,导航到Declarations选项卡,选择“File Type Associations”,然后点击Add。现在,您需要根据您的应用程序想要支持的文件类型填写右侧窗格上的字段:有关详细信息,请参见MSDN
然后,您可以枚举可移动驱动器及其子文件/文件夹,就像这些示例一样。例如,要枚举顶层文件(C#,抱歉):
var drives = await Windows.Storage.KnownFolders.RemovableDevices.GetItemsAsync();

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

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

(2) 从文件加载图像

无法直接从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(); 对我来说有效,可以退出应用程序,并奇怪地显示“请稍候,我们正在设置您的设备”的进度旋转器,这似乎仍然潜藏在后面。


太棒了,虽然我还无法让它工作,但是你的评论和链接给了我方向,我相信我应该能够从这里解决问题 :)。 - Dan Donoghue
哪个部分出了问题? - peterdn
第一部分和第二部分是因为我是一个VBA编码人员,所以理解VB.NET对我来说是一个挑战。第三部分完美地工作了 :) 由于我之前的VB.NET项目中不能使用图片框等,因此Pi进一步增加了难度。 - Dan Donoghue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接