Windows Phone 7開發遇到的事:保存、讀取圖片

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

讀取圖片

圖片的來源通常有3個地方:網絡、獨立存儲和程序包。網絡

從網絡讀取圖片

[csharp]  view plain copy
 
  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 plain copy
 
  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 plain copy
 
  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圖片文件了。post

 

[csharp]  view plain copy
 
  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。spa

 

第二種:.net

 

[csharp]  view plain copy
 
  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保存圖片的方法。下面是介紹直接下載圖片到獨立存儲:component

 

[csharp]  view plain copy
 
  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 plain copy
 
  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對象

相關文章
相關標籤/搜索