Windows Phone 7开发遇到的事:保存、读取图片
http://blog.csdn.net/leons77/article/details/8085662
读取图片
图片的来源一般有3个地方:网络、独立存储和程序包。
从网络读取图片
- string uri = "http://avatar.csdn.net/2/C/D/3_leons77.jpg";
- BitmapImage bitmapImage = new BitmapImage();
- bitmapImage.UriSource = new Uri(uri, UriKind.Absolute);
- //image是一个Image控件
- image.Source = bitmapImage;
从网络保存图片到独立存储
- string uri = "http://avatar.csdn.net/2/C/D/3_leons77.jpg";
- BitmapImage bitmapImage = new BitmapImage();
- bitmapImage.UriSource = new Uri(uri, UriKind.Absolute);
- //当成功下载和解码图像源后发生的委托
- bitmapImage.ImageOpened += new EventHandler<RoutedEventArgs>(bitmapImage_ImageOpened);
- //image是一个Image控件
- image.Source = bitmapImage;
- //当成功下载和解码图像源后运行下面的代码
- void bitmapImage_ImageOpened(object sender, RoutedEventArgs e)
- {
- //下面的代码意思是:将图片对象编码为流,再通过流把图片保存到独立存储里
- using (MemoryStream memoryStream = new MemoryStream())
- {
- WriteableBitmap writeableBitmap = new WriteableBitmap(sender as BitmapImage);
- Extensions.SaveJpeg(writeableBitmap, memoryStream, writeableBitmap.PixelWidth, writeableBitmap.PixelHeight, 0, 100);
- //文件名
- string fileName = "image.jpg";
- using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())
- {
- //先看看有没有该名字的文件,有就删除。
- if (store.FileExists(fileName))
- {
- store.DeleteFile(fileName);
- }
- using (IsolatedStorageFileStream fileStream = store.OpenFile(fileName, FileMode.OpenOrCreate, FileAccess.Write))
- {
- using (BinaryWriter writer = new BinaryWriter(fileStream))
- {
- writer.Write(memoryStream.GetBuffer());
- }
- }
- }
- }
- }
注意:只有当Image控件的Source使用BitmapImage时,BitmapImage才会去下载图片,才会执行它的ImageOpened委托。
从独立存储里读取图片
通过上面的“从网络保存图片到独立存储”,独立存储里面已经有一张image.jpg图片文件了。
- //文件名
- string fileName = "image.jpg";
- using (IsolatedStorageFileStream stream = IsolatedStorageFile.GetUserStoreForApplication().OpenFile(fileName, FileMode.Open, FileAccess.Read))
- {
- BitmapImage bitmapImage = new BitmapImage();
- bitmapImage.SetSource(stream);
- //image是一个Image控件
- image.Source = bitmapImage;
- }
从程序包里读取图片
两种方法:
第一种最简单,用Image控件直接在XAML里面设置它的Source属性就好了。注意:图片的生成操作一定要是Resource。
第二种:
- //文件名
- //注意:如果程序包中的图片文件是用Resource的生成操作,就要用"/程序包名;component/图片文件名"的方法才能找到文件。
- //如果是用内容(content)的生成操作,直接用"图片文件名"。
- string fileName = "/SaveLoadImage;component/y.jpg";
- using (Stream stream = Application.GetResourceStream(new Uri(fileName, UriKind.Relative)).Stream)
- {
- BitmapImage bitmapImage = new BitmapImage();
- bitmapImage.SetSource(stream);
- //image是一个Image控件
- image.Source = bitmapImage;
- }
保存图片
上面已经介绍了用Image控件+BitmapImage保存图片的方法。下面是介绍直接下载图片到独立存储:
- string uri = "http://avatar.csdn.net/2/C/D/3_leons77.jpg";
- WebClient webClient = new WebClient();
- webClient.OpenReadCompleted += new OpenReadCompletedEventHandler(webClient_OpenReadCompleted);
- webClient.OpenReadAsync(new Uri(uri, UriKind.Absolute));
- void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
- {
- if (e.Error == null && !e.Cancelled)
- {
- using (BinaryReader reader = new BinaryReader(e.Result))
- {
- using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())
- {
- //文件名
- string fileName = "image.jpg";
- //先看看有没有该名字的文件,有就删除。
- if (store.FileExists(fileName))
- {
- store.DeleteFile(fileName);
- }
- using (IsolatedStorageFileStream fileStream = store.OpenFile(fileName, FileMode.OpenOrCreate, FileAccess.Write))
- {
- using (BinaryWriter writer = new BinaryWriter(fileStream))
- {
- writer.Write(reader.ReadBytes(Convert.ToInt32(e.Result.Length)));
- }
- }
- }
- }
- }
- }
注意:这里用的是WebClient下载图片,如果图片过大的话,下载的时候UI就会被卡死。最好用HttpWebRequst异步下载。我之前的博客《WP7(Windows Phone)开发遇到的事:使用get、post请求》有写怎么使用HttpWebRequst