2014-01-12 32 views
2

我是Windows 8开发和微软技术的新手。我做了很多iOS开发,但之前我从未碰过Visual Studio,C#等,因此我一次性学习了很多(框架,IDE,语言)。请原谅我,如果这是简单的,但我无法在任何地方找到答案。通过BitmapImage在某些目录中加载图像E_NETWORK_ERROR

注:我使用Visual Studio Express的2013,C#和Windows 8.1

为了便于学习,我只是想创建一个加载图像的应用程序,它们显示在屏幕上,并允许用户旋转,移动,调整大小和排列它们。我有这个工作,除了一个主要的错误,我无法弄清楚:当我从一些目录加载图像一切正常,当我加载其他目录的图像时,我得到E_NETWORK_ERROR和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_ERROR。如果我将相机胶卷目录中的图像复制到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_NETWORK_ERROR

C:\Users\Adam\Pictures\Camera Roll\WIN_20131023_194718.JPG 
file:///C:/Users/Adam/Pictures/Camera Roll/WIN_20131023_194718.JPG 

回答

2

我解决了这个问题,但我并不是100%确定我理解我解决问题的方式/原因。

我切换到使用Windows.Storage.Streams.IRandomAccessStream读取文件到的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); 

} 

} 

这解决了这个问题,我现在可以从任意加载图像文件位置。但是,我不是100%为什么这解决了这个问题。我想认为它与异步有关。我认为我以前的做法会以某种方式导致BitmapImage或Image在显示时不包含实际图像数据。我认为这个解决方案是让显示代码等待,直到我们真的花时间加载图像。即使这个问题解决了,如果一个

2

奇怪的问题导致的,但我认为你应该修改你的代码,这里暗示this answer。尝试通过加载流来创建图像,而不是使用文件路径。

可以肯定的是,您的应用程序是否有权访问用户库中的文件?

+1

谢谢。我最终用流解决了这个问题。我上面发布了解决方案。问题:我不明白为什么解决方案解决了问题。我发现,在我学习Windows应用商店应用程序开发时,我经常无法理解Cocoa/Cocoa Touch可以使用的方式背后的“为什么”。 –