图片压缩上传和下载的一点心得

本文参考自:

1.bomo的这篇博客

2.保存图片到媒体库的这篇文章

3.晴天猪的这篇文章

初衷是图片上传,节省流量,中间发现几个技巧,分享如下:

1.本地/拍照上传图片到网络(经过压缩)

注意:使用using释放stream,和stream.dispose(),stream.close()没有区别,是清理非托管资源,比如stream流,

gc.collect()的含义是清理自己定义的string等,是清理托管资源,即使不清理,微软也会在离开页面的时候清理掉未使用的。

 private void MediaGet(object sender, RoutedEventArgs e)
        {
            _photoChooserTask = new PhotoChooserTask();
            _photoChooserTask.ShowCamera = true;
            _photoChooserTask.Show();
            _photoChooserTask.Completed += photoChooserTask_Completed;
        }

        private void photoChooserTask_Completed(object sender, PhotoResult e)
        {
            if (e.TaskResult == TaskResult.OK)
            {
                var bmp = new BitmapImage();
                using (Stream stream = e.ChosenPhoto)
                {
                    using (Stream tempStream = PublicMethod.CompressImage(stream))
                    {
                        bmp.SetSource(tempStream);
                        Img.Source = bmp;
                    }
                    GC.Collect();
                }
            }
        }
//PublicMethod的压缩图片方法(参考自bomo):
 public static Stream CompressImage(Stream imageStream)
      {
          if (imageStream.Length > 45 * 1024)
          {
              if (imageStream.CanSeek)
              {
                  imageStream.Seek(0, SeekOrigin.Begin);
              }
              var bitmapImage = new BitmapImage();
              bitmapImage.SetSource(imageStream);
              var writeableBitmap = new WriteableBitmap(bitmapImage);
              var tempStreamm = new MemoryStream();
              Size size = GetSize(bitmapImage.PixelWidth, bitmapImage.PixelHeight);
              writeableBitmap.SaveJpeg(tempStreamm, (int)size.Width, (int)size.Height, 0, 60);
              return tempStreamm;
          }
          return imageStream;
      }

  2.下载图片到媒体库,注意:图片没法直接从网络上下载到媒体库,需要独立存储这个介质。

 private void ToMedia(object sender, RoutedEventArgs e)
        {
//                StreamResourceInfo sri = null;
            var uri =new Uri("http://www.ii123.com/uploads/allimg/c121115/1352a1P016350-3T040.jpg",UriKind.RelativeOrAbsolute);
//                sri = Application.GetResourceStream(uri);
//                _stream = sri.Stream;//这是读本地,只能加载本地的地址
            if (NetworkInterface.GetIsNetworkAvailable())
            {
                var webClient = new WebClient();
                webClient.OpenReadAsync(uri);
                webClient.OpenReadCompleted += webClient_OpenReadCompleted;
            }
        }

        private void webClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
            const string filename = "Temp.jpeg";
            IsolatedStorageFile myStore = IsolatedStorageFile.GetUserStoreForApplication();
            if (myStore.FileExists(filename))
                myStore.DeleteFile(filename);
            IsolatedStorageFileStream filestream = myStore.CreateFile(filename);
            //using自动释放流
            using (filestream)
            {
                var image = new BitmapImage();
                image.SetSource(e.Result);
                var captureimage = new WriteableBitmap(image);
                captureimage.SaveJpeg(filestream, captureimage.PixelWidth, captureimage.PixelHeight, 0, 80);
            }
            //更改filestream权限
            using (filestream = myStore.OpenFile(filename, FileMode.Open, FileAccess.Read))
            {
                var midiaLibrary = new MediaLibrary();
                midiaLibrary.SavePicture(filename, filestream);
            }
            myStore.DeleteFile(filename); //删除独立存储中多余图片
            MessageBox.Show("Saved Success");
        }

test

posted on 2014-09-04 15:04  鸣动我心  阅读(341)  评论(0编辑  收藏  举报