• 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

  • 相关阅读:
    SQLSERVER中的sp_reset_connection存储过程的作用
    SQLSERVER数据库经常置疑的原因
    sqlserver2005数据库邮件
    SQLSERVER书签查找的通俗理解
    msdb数据库里的表究竟存储什么信息
    造成阻塞和死锁的3大原因:
    SQLSERVER中的锁资源类型RID KEY PAG EXT TAB DB FIL
    总结一下要影响SQLSERVER锁的申请和释放行为要考虑的因素
    Linux下getsockopt/setsockopt 函数说明
    HTTP协议详解(转)
  • 原文地址:https://www.cnblogs.com/xlyg-14/p/4950473.html
Copyright © 2020-2023  润新知