C# 通过BitmapImage加载某些目录中的图像会导致E_网络_错误

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 出于学习目的,我只是尝试创建一个应用程序,加载图像,在屏幕上显示它们,并允许用户旋转、移动、调整大小和排列它们。我已经做到这一点,除了一个我不知道的主要错误:当我从一些

我不熟悉Windows 8开发和Microsoft技术。我做过很多iOS开发,但我以前从未接触过Visual Studio、C等,所以我一次就学习了很多框架、IDE和语言。如果这是一件简单的事情,请原谅我,但我在任何地方都找不到答案

注意:我使用的是Visual Studio Express 2013、C和Windows 8.1

出于学习目的,我只是尝试创建一个应用程序,加载图像,在屏幕上显示它们,并允许用户旋转、移动、调整大小和排列它们。我已经做到这一点,除了一个我不知道的主要错误:当我从一些目录加载图像时,一切正常;当我从其他目录加载图像时,我得到E_NETWORK_错误和BitmapImage.ImageFailed。我看不出有什么理由。我可以把一张图片放到一个目录中,它会加载,把同一张图片复制到另一个目录中,而不会加载

代码如下:

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那样理解背后的原因。