【WP8】图片压缩处理
最近在做图片上传功能,类似于微信朋友圈的功能,现在的手机像素都比较高,手机上的图片一般都比较大(几M),对于大图,在上传之前,我们需要对图片进行压缩(分辨率和质量),再上传到服务器,以减少网路流量传输
实现思路:
判断图片是否大于指定的大小
否:原图上传
是:通过BitmapImage检测出图片分辨率,然后将分辨率限制在1200*1200分辨率以内(保持宽高比),然后通过SaveJpeg方法写入到流中
笔者测试,绝大部分图片处理后都能控制在300kb以内(部分超过一点)
using System;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging; namespace XTuOne.Utility.Helpers
{
public class ImageHelper
{
/// <summary>
/// 压缩图片
/// </summary>
/// <param name="imageStream">输入</param>
/// <param name="quality">压缩质量</param>
/// <param name="maxKb">最大大小(单位kb)只供参考</param>
public static Stream CompressImage(Stream imageStream, int quality = , int maxKb = )
{
if (imageStream.Length > *)
{
if (imageStream.CanSeek)
{
imageStream.Seek(, SeekOrigin.Begin);
}
var bitmapImage = new BitmapImage();
bitmapImage.SetSource(imageStream);
var writeableBitmap = new WriteableBitmap(bitmapImage);
var tempStreamm = new MemoryStream();
var size = GetSize(bitmapImage.PixelWidth, bitmapImage.PixelHeight);
writeableBitmap.SaveJpeg(tempStreamm, (int)size.Width, (int)size.Height, , );
return tempStreamm;
}
return imageStream;
} private static Size GetSize(Size size)
{
return GetSize(size.Width, size.Height);
} private static Size GetSize(double width, double height)
{
if (width > height)
{
if (width > )
{
return new Size(, Convert.ToInt32(height * / width));
}
return new Size(width, height);
}
else
{
if (height > )
{
return new Size(Convert.ToInt32(width * / height), );
}
return new Size(width, height);
}
}
}
}
测试中发现一个问题:如果图片太大(5000*5000)的话,BitmapImage读取出来的宽高会被限制在4096*4096之内,如果超过4096,则取4096,保持宽高比,所以如果图片过大,通过BitmapImage是无法获取到图片的真实分辨率的
下面演示读取SavePicture文件夹中的图片,并进行压缩
var library = new MediaLibrary();
foreach (var savedPicture in library.SavedPictures)
{
using (var stream = savedPicture.GetImage())
{
using (var tempStream = ImageHelper.CompressImage(stream))
{
Debug.WriteLine("图片压缩前大小:{0:f2}kb, 图片压缩后大小:{1:f2}kb", stream.Length/1024.0,
tempStream.Length/1024.0);
}
GC.Collect();
}
}
注意:对图片的处理(特别是比较大的图片)很容易造成内存不足的情况(笔者在测试的时候,处理到第三张图片(比较大的图片5-10M)的时候就会出现内存不足的情况)
所以在使用的时候,没用的Stream应该及时释放掉(using),如果有多张图片需要处理
为了防止内存不足造成异常,可以通过延迟处理,在处理完一张图片后,等待100毫秒,然后继续
//延迟0.1秒
await Task.Delay();
【WP8】图片压缩处理的更多相关文章
- Golang 编写的图片压缩程序,质量、尺寸压缩,批量、单张压缩
目录: 前序 效果图 简介 全部代码 前序: 接触 golang 不久,一直是边学边做,边总结,深深感到这门语言的魅力,等下要跟大家分享是最近项目 服务端 用到的图片压缩程序,我单独分离了出来,做成了 ...
- 三款不错的图片压缩上传插件(webuploader+localResizeIMG4+LUploader)
涉及到网页图片的交互,少不了图片的压缩上传,相关的插件有很多,相信大家都有用过,这里我就推荐三款,至于好处就仁者见仁喽: 1.名气最高的WebUploader,由Baidu FEX 团队开发,以H5为 ...
- 前端构建工具之gulp(一)「图片压缩」
前端构建工具之gulp(一)「图片压缩」 已经很久没有写过博客了,现下终于事情少了,开始写博吧 今天网站要做一些优化:图片压缩,资源合并等 以前一直使用百度的FIS工具,但是FIS还没有提供图片压缩的 ...
- gulp图片压缩
gulp图片压缩 网页性能优化,通常要处理图片,尤其图片量大的时候,更需要工具来批量处理,这里使用gulp,做个简单总结 image-resize压缩尺寸 var gulp = require('gu ...
- Android 图片压缩、照片选择、裁剪,上传、一整套图片解决方案
1.Android一整套图片解决方案 http://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650820998&idx=1& ...
- Java中图片压缩处理
原文http://cuisuqiang.iteye.com/blog/2045855 整理文档,搜刮出一个Java做图片压缩的代码,稍微整理精简一下做下分享. 首先,要压缩的图片格式不能说动态图片,你 ...
- android 图片压缩
引用:http://104zz.iteye.com/blog/1694762 第一:我们先看下质量压缩方法: private Bitmap compressImage(Bitmap image) { ...
- HTML5 CANVAS 实现图片压缩和裁切
原文地址:http://leonshi.com/2015/10/31/html5-canvas-image-compress-crop/?utm_source=tuicool&utm_medi ...
- C# 图片压缩
/// <summary> /// 图片压缩方法 /// </summary> /// <param name="sF ...
随机推荐
- jQuery实现radio第一次点击选中第二次点击取消功能(转)
转载自:http://www.jb51.net/article/113730.htm 由于项目的需求,要求radio点击两次后为取消状态,不方便修改为checkbox,可以用正面的方法实现. // j ...
- [转]oracle在删除表\表空间\用户时,如何释放磁盘空间
一.drop表 执行drop table xx 语句 drop后的表被放在回收站(user_recyclebin)里,而不是直接删除掉.这样,回收站里的表信息就可以被恢复,或彻底清除. 通过查询回收站 ...
- markdown学习资料
参考资料 Markdown--入门指南 Markdown 语法手册 (完整整理版)
- [mqtt]mqtt嵌入式移植
github eclipse paho source code: https://github.com/mqtt/mqtt.github.io/wiki/libraries STM32 mqtt移植: ...
- backlight 子系统(转载)
http://blog.csdn.net/weiqing1981127/article/details/8511676 Linux下的Backlight子系统(一) http://blog.csd ...
- C++中嵌入python程序——命令行模式
http://blog.csdn.net/yiyouxian/article/details/51992721
- JTree常用方法
private JTree jtNetDevice;//数组件申明private JScrollPane jspTree;//滚动面板申明 1.初始化 DefaultMutableTreeNo ...
- Spring配置文件<context:property-placeholder>标签使用漫谈
<context:property-placeholder>标签提供了一种优雅的外在化参数配置的方式,不过该标签在Spring配置文件中只能存在一份!!! 众所周知,Spring容器是采用 ...
- JQuery操作cookies
jQuery.cookie = function(name, value, options) { if (typeof value != 'undefined') { // name and valu ...
- Ogre 编辑器三(自动生成与更新Ogre对象编辑界面)
最开始设计这个编辑器时,其中一个要求就是能在运行过程中,通过UI来更新各对象,这样我们就能明确每个Ogre对象更新其属性影响的渲染效果.比如点光源,方向光源,聚光灯各属性与效果,深度测试开启与关闭,深 ...