基于html5 canvas 的客户端异步上传图片的插件,支持客户端压缩图片尺寸
/**
* Created by xx on 15-05-28.
* 基于html5 canvas 的客户端异步上传画片的插件
* 在实际应用中,常常要用于上传图片的功能.在现在越来越多的手机webapp应用中,上传图片功能的问题尤为实出,
* 主要表显为:1 手机摄象头太牛B,随便拍拍,照片都有几M
* 2 在没有wifi的情况下,移动网络上线照片还是有点慢的
* 解决以上问题,主要的思路还是在客户端压缩图片尺寸,这就用到这个插件了
*
* 插件中的核心代码参照网络,自己整理了一下
*
* 使用方法
* $("#xxfile").xxUploadImg({
url: 'upload.php', //上传服务器url
max: 100, // 上传图片的高或宽(大的那个)的最大值 ,当此值为0时,不压缩
fileType: 'image/png', //文件格式: image/png image/jpeg 经测试在微信中 jpeg无效
param: false, //因为上传是异步的,这里是 需要传递的参数
callbackFun: function (ret, param) { // 上传成功后的回调函数
$("#show_img").attr("src", ret);
}
})
*/ (function ($) {
$.fn.xxUploadImg = function (options) {
if (typeof options == "string") {
options = {"fileId": options};
}
// build main options before element iteration
var opts = $.extend({}, $.fn.xxUploadImg.defaults, options);
return this.each(function () {
var $this = $(this);
// build element specific options
var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
o.fileObj = $this[0].files[0]; // 获取 canvas DOM 对象
o.canvas = document.getElementById(o.canvasId);
if (!o.canvas) {
o.canvas = document.createElement("canvas");
o.canvas.style.display = "none";
} // 获取 canvas的 2d 环境对象,
// 可以理解Context是管理员,canvas是房子
o.ctx = o.canvas.getContext("2d"); loadImage(o);
});
} // 加载 图像文件(url路径)
function loadImage(o) {
// var src = document.getElementById(o.fileId).files[0];
// 过滤掉 非 image 类型的文件
if (!o.fileObj.type.match(/image.*/)) {
if (window.console) {
console.log("选择的文件类型不是图片: ", o.fileObj.type);
} else {
window.confirm("只能选择图片文件");
} return;
} // 创建 FileReader 对象 并调用 render 函数来完成渲染.
var reader = new FileReader();
// 绑定load事件自动回调函数
reader.onload = function (e) {
// 调用前面的 render 函数
render(e.target.result, o);
};
// 读取文件内容
reader.readAsDataURL(o.fileObj);
} // 渲染
function render(src, o) {
// 创建一个 Image 对象
var image = new Image();
// 绑定 load 事件处理器,加载完成后执行
image.onload = function () { if (o.max > 0) {
if (image.height > image.width) {
// 如果高度超标
if (image.height > o.max) {
// 宽度等比例缩放 *=
image.width *= o.max / image.height;
image.height = o.max;
}
} else {
if (image.width > o.max) {
// 宽度等比例缩放 *=
image.height *= o.max / image.width;
image.width = o.max;
}
}
} // canvas清屏
o.ctx.clearRect(0, 0, o.canvas.width, o.canvas.height);
// 重置canvas宽高
// 这里是使用canvas一个坑,就是先要给canvas设置宽高,然后才可以调用旋转等操作
o.canvas.width = image.width;
o.canvas.height = image.height;
// 将图像绘制到canvas上
o.ctx.drawImage(image, 0, 0, image.width, image.height);
// !!! 注意,image 没有加入到 dom之中 upload(o);
};
// 设置src属性,浏览器会自动加载。
// 记住必须先绑定事件,才能设置src属性,否则会出同步问题。
image.src = src;
}; function upload(o) {
//上传
var dataurl = o.canvas.toDataURL(o.fileType);
// 为安全 对URI进行编码
// data%3Aimage%2Fpng%3Bbase64%2C 开头
var imagedata = encodeURIComponent(dataurl);
$.post(o.url,
{
img: dataurl
},
function (ret) {
o.callbackFun(ret, o.param);
})
} $.fn.xxUploadImg.defaults = {
fileObj: false, //file对象 canvasId: 'xxcanvas', //canvas标签的ID
canvas: false, //canvas标签的ID
ctx: false, //canvas标签的ID url: '', //上传服务器url
max: 0, //压缩图片尺寸大小
fileType: 'image/png', //文件格式 image/png image/jpeg 经测试在微信中 jpeg无效
param: false, //需要传递的参数
callbackFun: function (ret, param) {
} //回调函数
}
})(jQuery);
源代码转自--http://git.oschina.net/opmetic/xxUploadImg
基于html5 canvas 的客户端异步上传图片的插件,支持客户端压缩图片尺寸的更多相关文章
- smoke.js是一款基于HTML5 Canvas的逼真烟雾特效js插件。通过该js插件,可以非常轻松的在页面中制作出各种烟雾效果。
Smoke.js 是一个浏览器默认警告系统的JavaScript替代品,如果你想要跨浏览器与平台的标准化JavaScript警告窗口,Smoke.js就是你想要的. Smoke.js是一个轻量级且灵活 ...
- 基于HTML5 Canvas实现的图片马赛克模糊特效
效果请点击下面网址: http://hovertree.com/texiao/html5/1.htm 一.开门见山受美国肖像画家Chuck Close的启发,此脚本通过使用HTML5 canvas元素 ...
- 基于html5 canvas和js实现的水果忍者网页版
今天爱编程小编给大家分享一款基于html5 canvas和js实现的水果忍者网页版. <水果忍者>是一款非常受喜欢的手机游戏,刚看到新闻说<水果忍者>四周年新版要上线了.网页版 ...
- 基于HTML5 Canvas的线性区域图表教程
之前我们看到过很多用jQuery实现的网页图表,有些还是比较实用的.今天我们来介绍一款基于HTML5 Canvas的线性区域图表应用,这个图表应用允许你使用多组数据来同时展示,并且将数据结果以线性图的 ...
- 基于HTML5 Canvas的网页画板实现教程
HTML5的功能非常强大,尤其是Canvas的应用更加广泛,Canvas画布上面不仅可以绘制任意的图形,而且可以实现多种多样的动画,甚至是一些交互式的应用,比如网页网版.这次我们要来看的就是一款基于H ...
- 基于HTML5 Canvas实现用户交互
很多人都有这样的疑问,基于HTML5 Canvas实现的元素怎么和用户进行交互?在这里我们用到HT for Web(http://www.hightopo.com/guide/guide/core/b ...
- 基于html5 Canvas图表库 : ECharts
ECharts开源来自百度商业前端数据可视化团队,基于html5 Canvas,是一个纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表.创新的拖拽重计算.数据视图.值 ...
- 基于 HTML5 Canvas 的智能安防 SCADA 巡逻模块
基于 HTML5 Canvas 的智能安防 SCADA 巡逻模块 前言 最近学习了 HT for Web flow 插件,除了正常的 flow 效果,其中还有两个十分好用的两个接口 getPercen ...
- 基于HTML5 Canvas粒子效果文字动画特效
之前我们分享过很多超酷的文字特效,其中也有利用HTML5和CSS3的.今天我们要来分享一款基于HTML5 Canvas的文字特效,输入框中输入想要展示的文字,回车后即可在canvas上绘制出粒子效果的 ...
随机推荐
- Entity Framework 同一个上下文中,如何进行对同一个实体进行指定字段更新
转自 http://www.cnblogs.com/flyfish2012/archive/2013/03/13/2957125.html 我在上一篇EF更新指定的字段当中介绍了,如何在EF指定字段进 ...
- Intellij Idea生成serialVersionUID的方法
默认情况下Intellij IDEA是关闭了继承了java.io.Serializable的类生成serialVersionUID的警告.如果需要ide提示生成serialVersionUID,那么需 ...
- 利用sdkman安装kotlin和java环境
如果想在命令行下面运行kotlin程序,最省事的办法就是用sdkman来安装了: 1.安装sdkman: curl -s "https://get.sdkman.io" | bas ...
- Android 关于Fragment一些简单注意事项
1.Fragment的生命周期一定要了解清楚: 其实没有什么好说的. 注意关键字所执行的方法: 注意下面基本fragmentTransaction.replace();运行 当FragmentA(初始 ...
- 【Unity】7.6 自定义输入
分类:Unity.C#.VS2015 创建日期:2016-04-21 一.简介 在Unity中可以创建自定义的虚拟按键,然后将设备的输入映射到自定义的按键上.使用虚拟按键的好处是可以让游戏玩家自己定义 ...
- socket.io笔记一
//服务端代码 var server = require('http').createServer(app); var io = require('socket.io')(server,{path:' ...
- hive一行变多行及多行变一行
hive一行变多行及多行变一行 场景 name alias zhaoqiansun abc def ghi 处理数据时需要将上表处理成为下面的形式: name alias zhaoqiansun ab ...
- 【X-Forwarded-For】WEB修改访客IP
X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段. Squid 缓存代理服务器的开发人员最早引入了这一HT ...
- Python(八)之函数
Python函数 函数作用: (1)代码重用 (2)一种设计工具,分解复杂问题 (3)将相关功能打包并参数化 函数种类: 全局函数:定义在模块中 局部函数:嵌套在其他函数中 lambda函数:表达式 ...
- Ubuntu 安装 mysql
sudo apt-get install mysql-server sudo apt install mysql-client sudo apt install libmysqlclient-dev