如何在 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" 进度微调器,它显然仍然潜伏在后面。
我已经成功创建了我的第一个物联网项目,并且可以通过按下 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" 进度微调器,它显然仍然潜伏在后面。