C# 通过BitmapImage加载某些目录中的图像会导致E_网络_错误
我不熟悉Windows 8开发和Microsoft技术。我做过很多iOS开发,但我以前从未接触过Visual Studio、C等,所以我一次就学习了很多框架、IDE和语言。如果这是一件简单的事情,请原谅我,但我在任何地方都找不到答案 注意:我使用的是Visual Studio Express 2013、C和Windows 8.1 出于学习目的,我只是尝试创建一个应用程序,加载图像,在屏幕上显示它们,并允许用户旋转、移动、调整大小和排列它们。我已经做到这一点,除了一个我不知道的主要错误:当我从一些目录加载图像时,一切正常;当我从其他目录加载图像时,我得到E_NETWORK_错误和BitmapImage.ImageFailed。我看不出有什么理由。我可以把一张图片放到一个目录中,它会加载,把同一张图片复制到另一个目录中,而不会加载 代码如下:C# 通过BitmapImage加载某些目录中的图像会导致E_网络_错误,c#,windows-runtime,winrt-xaml,windows-8.1,imaging,C#,Windows Runtime,Winrt Xaml,Windows 8.1,Imaging,我不熟悉Windows 8开发和Microsoft技术。我做过很多iOS开发,但我以前从未接触过Visual Studio、C等,所以我一次就学习了很多框架、IDE和语言。如果这是一件简单的事情,请原谅我,但我在任何地方都找不到答案 注意:我使用的是Visual Studio Express 2013、C和Windows 8.1 出于学习目的,我只是尝试创建一个应用程序,加载图像,在屏幕上显示它们,并允许用户旋转、移动、调整大小和排列它们。我已经做到这一点,除了一个我不知道的主要错误:当我从一些
private async void addImageButton_Click(object sender, RoutedEventArgs e)
{
Windows.Storage.Pickers.FileOpenPicker filePicker = new Windows.Storage.Pickers.FileOpenPicker();
filePicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.PicturesLibrary;
filePicker.FileTypeFilter.Add(".jpg");
filePicker.FileTypeFilter.Add(".png");
filePicker.FileTypeFilter.Add(".bmp");
filePicker.ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail;
Windows.Storage.StorageFile imageFile = await filePicker.PickSingleFileAsync();
if (imageFile != null)
{
System.Diagnostics.Debug.WriteLine(imageFile.Path);
Windows.UI.Xaml.Media.Imaging.BitmapImage bitmap = new Windows.UI.Xaml.Media.Imaging.BitmapImage(new Uri(imageFile.Path));
System.Diagnostics.Debug.WriteLine(bitmap.UriSource);
bitmap.CreateOptions = Windows.UI.Xaml.Media.Imaging.BitmapCreateOptions.None;
Image img = new Image();
img.Source = bitmap;
this.theCanvas.Children.Add(img);
}
}
这似乎对某些目录中的图像文件非常有效,而对其他目录则根本不起作用。例如:在我的图片库中,我有一个Windows 8摄像头应用程序保存到的摄像头滚动目录,还有我的Steam屏幕截图目录。如果我尝试在我的Steam屏幕截图目录中打开图像,效果会很好;但是,如果我尝试在Camera Roll目录中加载图像,它会失败,并出现E_NETWORK_错误。如果我将图像从相机滚动目录复制到Steam屏幕截图目录,我可以打开它们
有人能指出哪里出了问题吗?我开始认为这与其说是一个代码问题,不如说是一个安全性/功能/声明类型的问题。我是否需要声明或请求某些内容以获得对文件系统的无限制访问?我是否需要以不同的方式形成URI
编辑:以下是调试语句的一些输出,显示了路径和URI:
罚款:
C:\Program Files (x86)\Steam\userdata\24321739\760\remote\72850\screenshots\2013-12-04_00001.jpg
file:///C:/Program Files (x86)/Steam/userdata/24321739/760/remote/72850/screenshots/2013-12-04_00001.jpg
导致E_网络错误
C:\Users\Adam\Pictures\Camera Roll\WIN_20131023_194718.JPG
file:///C:/Users/Adam/Pictures/Camera Roll/WIN_20131023_194718.JPG
这是一个奇怪的问题,但我认为您应该像这里建议的那样修改代码。尝试通过加载流来创建图像,而不是使用文件路径
当然,你的应用程序有权限访问用户库中的文件吗?奇怪的问题,但我认为你应该按照这里的建议修改一下你的代码。尝试通过加载流来创建图像,而不是使用文件路径
只是想确定一下,您的应用程序是否具有访问用户库中文件的权限?我已经解决了这个问题,但我不能100%确定我是否理解我提出的解决方案是如何解决问题的 我通过切换到使用Windows.Storage.Streams.irandomaccesstream将文件读取到BitmapImage源中修复了该问题:
private async void addImageButton_Click(object sender, RoutedEventArgs e)
{
Windows.Storage.Pickers.FileOpenPicker filePicker = new Windows.Storage.Pickers.FileOpenPicker();
filePicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.PicturesLibrary;
filePicker.FileTypeFilter.Add(".jpg");
filePicker.FileTypeFilter.Add(".png");
filePicker.FileTypeFilter.Add(".bmp");
filePicker.ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail;
Windows.Storage.StorageFile imageFile = await filePicker.PickSingleFileAsync();
if (imageFile != null)
{
Windows.UI.Xaml.Media.Imaging.BitmapImage bitmap = new Windows.UI.Xaml.Media.Imaging.BitmapImage();
Windows.Storage.Streams.IRandomAccessStream stream = await imageFile.OpenAsync(Windows.Storage.FileAccessMode.Read);
Image newImage = new Image();
bitmap.SetSource(stream);
newImage.Source = bitmap;
newImage.Height = 250;
newImage.Stretch = Stretch.UniformToFill;
newImage.ManipulationMode = ManipulationModes.All;
newImage.ManipulationDelta += TestImage_ManipulationDelta;
this.theCanvas.Children.Add(newImage);
}
}
这解决了问题,我现在可以从任意位置加载图像文件。然而,我不是百分之百地理解为什么这解决了问题。我认为这与异步有关。我认为我以前的做法会导致BitmapImage或Image在显示时不包含实际的图像数据。我认为这个解决方案所做的是让显示代码等待,直到我们真正花时间加载图像。即使这个问题已经解决了,如果我解决了这个问题,但我不能100%确定我是否理解我得出的解决方案是如何解决问题的 我通过切换到使用Windows.Storage.Streams.irandomaccesstream将文件读取到BitmapImage源中修复了该问题:
private async void addImageButton_Click(object sender, RoutedEventArgs e)
{
Windows.Storage.Pickers.FileOpenPicker filePicker = new Windows.Storage.Pickers.FileOpenPicker();
filePicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.PicturesLibrary;
filePicker.FileTypeFilter.Add(".jpg");
filePicker.FileTypeFilter.Add(".png");
filePicker.FileTypeFilter.Add(".bmp");
filePicker.ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail;
Windows.Storage.StorageFile imageFile = await filePicker.PickSingleFileAsync();
if (imageFile != null)
{
Windows.UI.Xaml.Media.Imaging.BitmapImage bitmap = new Windows.UI.Xaml.Media.Imaging.BitmapImage();
Windows.Storage.Streams.IRandomAccessStream stream = await imageFile.OpenAsync(Windows.Storage.FileAccessMode.Read);
Image newImage = new Image();
bitmap.SetSource(stream);
newImage.Source = bitmap;
newImage.Height = 250;
newImage.Stretch = Stretch.UniformToFill;
newImage.ManipulationMode = ManipulationModes.All;
newImage.ManipulationDelta += TestImage_ManipulationDelta;
this.theCanvas.Children.Add(newImage);
}
}
这解决了问题,我现在可以从任意位置加载图像文件。然而,我不是百分之百地理解为什么这解决了问题。我认为这与异步有关。我认为我以前的做法会导致BitmapImage或Image在显示时不包含实际的图像数据。我认为这个解决方案所做的是让显示代码等待,直到我们真正花时间加载图像。即使解决了这个问题,如果a谢谢。我最终用一条小溪解决了这个问题。我在上面发布了解决方案。问题:我不明白为什么解决方案解决了这个问题。我发现,当我学习Windows应用商店应用程序开发时,我常常无法像使用Cocoa/Cocoa Touch那样理解背后的原因。谢谢。我最终用一条小溪解决了这个问题。我在上面发布了解决方案。问题:我不明白为什么解决方案解决了这个问题。我发现,当我学习Windows应用商店应用程序开发时,我常常无法像使用Cocoa/Cocoa Touch那样理解背后的原因。