Answered by:
Cannot display image which retireved from Local Folder

Question
-
I have some images files(.png) stored in LocalFolder. I want to retrieve it and display in Image control.
The code below has no compiled error but it did not work. Can anyone point out what wrong with my code. Both are not working. Method (2) : Bitmapimage is null ? event there is data in RandomAccess
Method 1:
private async void LoadAndDisplayImgFile(int ProdId)
{
string strFilenm = "S-" + ProdId.ToString() + ".png";var folder_path = System.IO.Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "ImgProd");
StorageFolder folder = await StorageFolder.GetFolderFromPathAsync(folder_path);
StorageFile storagefile = await folder.GetFileAsync(strFilenm);
StorageFile jpgFile = await folder.GetFileAsync(strFilenm);
DisplayImg(jpgFile);
}
private async void DisplayImg(StorageFile ImgFile)
{
IRandomAccessStream fileStream = await ImgFile.OpenAsync(FileAccessMode.Read);var reader = new Windows.Storage.Streams.DataReader(fileStream.GetInputStreamAt(0));
await reader.LoadAsync((uint)fileStream.Size);
byte[] pixels = new byte[fileStream.Size];reader.ReadBytes(pixels);
InMemoryRandomAccessStream ms = new InMemoryRandomAccessStream();
DataWriter writer = new DataWriter(ms.GetOutputStreamAt(0));
writer.WriteBytes(pixels as byte[]);
writer.StoreAsync().GetResults();BitmapImage image = new BitmapImage();
image.SetSource(ms);
await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
Image1.Source = image;});
}Method 2:
private async void LoadAndDisplayImgFile(int ProdId)
{
string strFilenm = "S-" + ProdId.ToString() + ".png";var folder_path = System.IO.Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "ImgProd");
StorageFolder folder = await StorageFolder.GetFolderFromPathAsync(folder_path);
StorageFile jpgFile = await folder.GetFileAsync(strFilenm);
IRandomAccessStream fileStream = await jpgFile.OpenAsync(Windows.Storage.FileAccessMode.Read);fileStream.Seek(0);
BitmapImage bi = new BitmapImage();
bi.SetSource(fileStream);
Image1.Source = bi;
}- Edited by Machine7 Sunday, December 21, 2014 2:41 PM
Sunday, December 21, 2014 11:07 AM
Answers
-
The following implementation of the LoadAndDisplayImgFile works when called with ProdId = 1 provided that there is a valid .png file named "S-1.png" in the local folder:
private async void LoadAndDisplayImgFile(int ProdId) { string strFilenm = "S-" + ProdId.ToString() + ".png"; var folder_path = System.IO.Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "ImgProd"); StorageFolder folder = await StorageFolder.GetFolderFromPathAsync(folder_path); StorageFile jpgFile = await folder.GetFileAsync(strFilenm); BitmapImage bitmapImage = new BitmapImage(); FileRandomAccessStream stream = await jpgFile.OpenAsync(FileAccessMode.Read) as FileRandomAccessStream; bitmapImage.SetSource(stream); Image1.Source = bitmapImage; }
<Image x:Name="Image1"/>
Please remember to mark helpful posts as answer and/or helpful.- Proposed as answer by Magnus (MM8)MVP Tuesday, December 23, 2014 8:36 AM
- Marked as answer by Herro wongMicrosoft contingent staff, Moderator Thursday, January 1, 2015 5:47 AM
Sunday, December 21, 2014 9:04 PM
All replies
-
There is a simple way to do this.
private void SetImageFromInstalledLocation() { BitmapImage image = new BitmapImage(new Uri("ms-appx:///Assets/2.png")); img1.Source = image; } private void SetImageFromIsolateStorage() { BitmapImage image = new BitmapImage(new Uri("ms-appdata:///local/Images/S1.png")); img2.Source = image; }
You can download my sample project form here.
在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
Sunday, December 21, 2014 3:52 PM -
The following implementation of the LoadAndDisplayImgFile works when called with ProdId = 1 provided that there is a valid .png file named "S-1.png" in the local folder:
private async void LoadAndDisplayImgFile(int ProdId) { string strFilenm = "S-" + ProdId.ToString() + ".png"; var folder_path = System.IO.Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "ImgProd"); StorageFolder folder = await StorageFolder.GetFolderFromPathAsync(folder_path); StorageFile jpgFile = await folder.GetFileAsync(strFilenm); BitmapImage bitmapImage = new BitmapImage(); FileRandomAccessStream stream = await jpgFile.OpenAsync(FileAccessMode.Read) as FileRandomAccessStream; bitmapImage.SetSource(stream); Image1.Source = bitmapImage; }
<Image x:Name="Image1"/>
Please remember to mark helpful posts as answer and/or helpful.- Proposed as answer by Magnus (MM8)MVP Tuesday, December 23, 2014 8:36 AM
- Marked as answer by Herro wongMicrosoft contingent staff, Moderator Thursday, January 1, 2015 5:47 AM
Sunday, December 21, 2014 9:04 PM -
Hi Magnus,
Your code work.
However, I don't seems to understand when I do some break point in the code at 3 and 5. I step thru in VS.
stream show this data :
CanRead true
CanWrite false
position 0
Size 389801
bitmapImage Show this:CreateOption None
DecodePexelHeight 0
DecodePixelType 0
UriSource nullIf bitmapImage is null or not base on the above? But in the end I got the image displayed.
Thanks
{
1) BitmapImage bitmapImage = new BitmapImage();
2) FileRandomAccessStream stream = await jpgFile.OpenAsync(FileAccessMode.Read) as FileRandomAccessStream;
3) bitmapImage.SetSource(stream);
4) Image1.Source = bitmapImage;5) }
Tuesday, December 23, 2014 1:24 AM