Windows Phone 7开发遇到的事:保存、读取图片

http://blog.csdn.net/leons77/article/details/8085662

读取图片

图片的来源一般有3个地方:网络、独立存储和程序包。

从网络读取图片

[csharp] view plaincopy
 
  1. string uri = "http://avatar.csdn.net/2/C/D/3_leons77.jpg";  
  2.   
  3. BitmapImage bitmapImage = new BitmapImage();  
  4. bitmapImage.UriSource = new Uri(uri, UriKind.Absolute);  
  5.   
  6. //image是一个Image控件  
  7. image.Source = bitmapImage;  

从网络保存图片到独立存储

[csharp] view plaincopy
 
  1. string uri = "http://avatar.csdn.net/2/C/D/3_leons77.jpg";  
  2.   
  3. BitmapImage bitmapImage = new BitmapImage();  
  4. bitmapImage.UriSource = new Uri(uri, UriKind.Absolute);  
  5. //当成功下载和解码图像源后发生的委托  
  6. bitmapImage.ImageOpened += new EventHandler<RoutedEventArgs>(bitmapImage_ImageOpened);  
  7.   
  8. //image是一个Image控件  
  9. image.Source = bitmapImage;  
[csharp] view plaincopy
 
  1. //当成功下载和解码图像源后运行下面的代码  
  2. void bitmapImage_ImageOpened(object sender, RoutedEventArgs e)  
  3. {  
  4.     //下面的代码意思是:将图片对象编码为流,再通过流把图片保存到独立存储里  
  5.     using (MemoryStream memoryStream = new MemoryStream())  
  6.     {   
  7.         WriteableBitmap writeableBitmap = new WriteableBitmap(sender as BitmapImage);  
  8.         Extensions.SaveJpeg(writeableBitmap, memoryStream, writeableBitmap.PixelWidth, writeableBitmap.PixelHeight, 0, 100);  
  9.   
  10.         //文件名  
  11.         string fileName = "image.jpg";  
  12.   
  13.         using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())  
  14.        {  
  15.            //先看看有没有该名字的文件,有就删除。  
  16.            if (store.FileExists(fileName))  
  17.            {  
  18.                store.DeleteFile(fileName);  
  19.            }  
  20.   
  21.            using (IsolatedStorageFileStream fileStream = store.OpenFile(fileName, FileMode.OpenOrCreate, FileAccess.Write))  
  22.            {  
  23.                 using (BinaryWriter writer = new BinaryWriter(fileStream))  
  24.                {  
  25.                    writer.Write(memoryStream.GetBuffer());  
  26.                }  
  27.            }  
  28.         }  
  29.     }  
  30. }  

注意:只有当Image控件的Source使用BitmapImage时,BitmapImage才会去下载图片,才会执行它的ImageOpened委托。

从独立存储里读取图片

通过上面的“从网络保存图片到独立存储”,独立存储里面已经有一张image.jpg图片文件了。

 

[csharp] view plaincopy
 
  1. //文件名  
  2. string fileName = "image.jpg";  
  3.   
  4. using (IsolatedStorageFileStream stream = IsolatedStorageFile.GetUserStoreForApplication().OpenFile(fileName, FileMode.Open, FileAccess.Read))  
  5. {  
  6.     BitmapImage bitmapImage = new BitmapImage();  
  7.     bitmapImage.SetSource(stream);  
  8.   
  9.     //image是一个Image控件  
  10.     image.Source = bitmapImage;  
  11. }  

 

从程序包里读取图片

 

两种方法:

第一种最简单,用Image控件直接在XAML里面设置它的Source属性就好了。注意:图片的生成操作一定要是Resource。

 

第二种:

 

[csharp] view plaincopy
 
  1. //文件名  
  2. //注意:如果程序包中的图片文件是用Resource的生成操作,就要用"/程序包名;component/图片文件名"的方法才能找到文件。  
  3. //如果是用内容(content)的生成操作,直接用"图片文件名"。  
  4. string fileName = "/SaveLoadImage;component/y.jpg";  
  5.   
  6. using (Stream stream = Application.GetResourceStream(new Uri(fileName, UriKind.Relative)).Stream)  
  7. {  
  8.     BitmapImage bitmapImage = new BitmapImage();  
  9.     bitmapImage.SetSource(stream);  
  10.   
  11.     //image是一个Image控件  
  12.     image.Source = bitmapImage;  
  13. }  

 

保存图片

 

上面已经介绍了用Image控件+BitmapImage保存图片的方法。下面是介绍直接下载图片到独立存储:

 

[csharp] view plaincopy
 
  1. string uri = "http://avatar.csdn.net/2/C/D/3_leons77.jpg";  
  2.   
  3. WebClient webClient = new WebClient();  
  4. webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted);  
  5. webClient.OpenReadAsync(new Uri(uri, UriKind.Absolute));  
[csharp] view plaincopy
 
  1. void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)  
  2. {  
  3.     if (e.Error == null && !e.Cancelled)  
  4.     {  
  5.         using (BinaryReader reader = new BinaryReader(e.Result))  
  6.         {  
  7.             using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())  
  8.            {  
  9.                //文件名  
  10.                string fileName = "image.jpg";  
  11.   
  12.                //先看看有没有该名字的文件,有就删除。  
  13.                if (store.FileExists(fileName))  
  14.                {  
  15.                    store.DeleteFile(fileName);  
  16.                }  
  17.   
  18.                using (IsolatedStorageFileStream fileStream = store.OpenFile(fileName, FileMode.OpenOrCreate, FileAccess.Write))  
  19.                {  
  20.                    using (BinaryWriter writer = new BinaryWriter(fileStream))  
  21.                    {  
  22.                        writer.Write(reader.ReadBytes(Convert.ToInt32(e.Result.Length)));  
  23.                    }  
  24.                 }  
  25.             }  
  26.         }  
  27.     }  
  28. }  

 

注意:这里用的是WebClient下载图片,如果图片过大的话,下载的时候UI就会被卡死。最好用HttpWebRequst异步下载。我之前的博客《WP7(Windows Phone)开发遇到的事:使用get、post请求》有写怎么使用HttpWebRequst

posted @ 2015-11-09 17:02  西楼月光  阅读(137)  评论(0编辑  收藏  举报