图片压缩上传和下载的一点心得
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");
}
浙公网安备 33010602011771号