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

读取图片

图片的来源一般有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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值