图片压缩上传和下载的一点心得
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"); }