/**
* 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 的客户端异步上传图片的插件,支持客户端压缩图片尺寸的更多相关文章

  1. smoke.js是一款基于HTML5 Canvas的逼真烟雾特效js插件。通过该js插件,可以非常轻松的在页面中制作出各种烟雾效果。

    Smoke.js 是一个浏览器默认警告系统的JavaScript替代品,如果你想要跨浏览器与平台的标准化JavaScript警告窗口,Smoke.js就是你想要的. Smoke.js是一个轻量级且灵活 ...

  2. 基于HTML5 Canvas实现的图片马赛克模糊特效

    效果请点击下面网址: http://hovertree.com/texiao/html5/1.htm 一.开门见山受美国肖像画家Chuck Close的启发,此脚本通过使用HTML5 canvas元素 ...

  3. 基于html5 canvas和js实现的水果忍者网页版

    今天爱编程小编给大家分享一款基于html5 canvas和js实现的水果忍者网页版. <水果忍者>是一款非常受喜欢的手机游戏,刚看到新闻说<水果忍者>四周年新版要上线了.网页版 ...

  4. 基于HTML5 Canvas的线性区域图表教程

    之前我们看到过很多用jQuery实现的网页图表,有些还是比较实用的.今天我们来介绍一款基于HTML5 Canvas的线性区域图表应用,这个图表应用允许你使用多组数据来同时展示,并且将数据结果以线性图的 ...

  5. 基于HTML5 Canvas的网页画板实现教程

    HTML5的功能非常强大,尤其是Canvas的应用更加广泛,Canvas画布上面不仅可以绘制任意的图形,而且可以实现多种多样的动画,甚至是一些交互式的应用,比如网页网版.这次我们要来看的就是一款基于H ...

  6. 基于HTML5 Canvas实现用户交互

    很多人都有这样的疑问,基于HTML5 Canvas实现的元素怎么和用户进行交互?在这里我们用到HT for Web(http://www.hightopo.com/guide/guide/core/b ...

  7. 基于html5 Canvas图表库 : ECharts

    ECharts开源来自百度商业前端数据可视化团队,基于html5 Canvas,是一个纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表.创新的拖拽重计算.数据视图.值 ...

  8. 基于 HTML5 Canvas 的智能安防 SCADA 巡逻模块

    基于 HTML5 Canvas 的智能安防 SCADA 巡逻模块 前言 最近学习了 HT for Web flow 插件,除了正常的 flow 效果,其中还有两个十分好用的两个接口 getPercen ...

  9. 基于HTML5 Canvas粒子效果文字动画特效

    之前我们分享过很多超酷的文字特效,其中也有利用HTML5和CSS3的.今天我们要来分享一款基于HTML5 Canvas的文字特效,输入框中输入想要展示的文字,回车后即可在canvas上绘制出粒子效果的 ...

随机推荐

  1. 如何在Windows环境下安装JDK

    原文链接:http://android.eoe.cn/topic/android_sdk 1. JDK 的下载 JDK有好几个类型版本,我们只需要选择Java SE类型的版本就行了. 进入网页:htt ...

  2. 在Android Studio 和 Eclipse 的 git 插件操作 "代码提交"以及"代码冲突"

    面向对象:曾经使用过SVN的同学. (因为Git 它 可以说是双重的SVN (本地一个服务器,远程一个服务器)),提交代码要有两次步骤,先提交到本地服务器,再把本地服务器在提交到远程服务器. 所以连S ...

  3. 【Unity】2.10 利用VS2015编辑Unity的C#脚本

    分类:Unity.C#.VS2015 创建日期:2016-03-31 一.简介 用VS2015编辑C#脚本时,如果让其"显示所有文件",就会看到VS2015解决方案资源管理器中项目 ...

  4. 【Unity】2.5 场景视图(Scene)

    分类:Unity.C#.VS2015 创建日期:2016-03-29 一.场景视图(Scene View)导航 场景视图 (Scene View) 是你的交互式沙箱.你可以使用场景视图 (Scene ...

  5. jQuery正则的使用

    转自:http://www.maiziedu.com/wiki/jquery/regular/ 基础正则 1.正则表达式的创建 a) var checkNum = /^[A-Za-z0-9]+$/; ...

  6. node webkit(nw.js) 设置自动更新

    原理:把更新的文件放在服务器上,设置一个客户端版本号,每次打开客户端的时候,通过接口获取服务器上的版本,如果高于本地的版本就下载服务器上的代码,低于或等于就不更新 <script> var ...

  7. mysql load数据第一列丢失

    mysql load数据第一列丢失 问题描述 MySQL表的结构如下: mysql> desc cms_msg_test_3; +----------------+--------------- ...

  8. SQL Server 商业智能

    原帖:http://bbs.51cto.com/thread-1089708-1.html 商业智能概述一.数据仓库与分析服务(SSAS)二.集成服务(SSIS)三.报表服务(SSRS)以下是SQL ...

  9. 【Miktex】使用教程以及数学符号整理总结

    LaTeX是当今世界上最流行和使用最为广泛的 TeX格式.它构筑在 Plain TeX的基础之上,并加进了很多的功能以使得使用者可以更为方便的利用 TeX的强大功能.使用 LaTeX基本上不需要使用者 ...

  10. python - hadoop,mapreduce demo

    Hadoop,mapreduce 介绍 59888745@qq.com 大数据工程师是在Linux系统下搭建Hadoop生态系统(cloudera是最大的输出者类似于Linux的红帽), 把用户的交易 ...