/**
* 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. [LintCode] N-Queens

    N-Queens The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no tw ...

  2. Shiro系列(1) - 权限管理的介绍与原理

    1. 什么是权限管理 一般来说,只要有用户参与,那么该系统都会需要权限管理,权限管理实现了对用户访问系统  指定功能的限制,按照管理员定义的安全规则或权限策略,限制用户只能访问自己被授权的那些资源路径 ...

  3. 探寻main函数的“标准”写法,以及获取main函数的参数、返回值

    main函数表示法        很多同学在初学C或者C++时,都见过各种各样的main函数表示法: main(){/*...*/} void main(){/*...*/} int main(){/ ...

  4. Gartner:2018人工智能技术成熟度曲线

    https://www.secrss.com/articles/4392 人工智能被广为关注,但是一些想法恐难达到预期.本成熟度曲线将追踪AI基本趋势和未来创新,以确定人工智能技术发展的范围.状态.价 ...

  5. 定期批量修改远程服务器root密码

    一.背景 很多时候运维或安全工作人员需要维护大量的服务器,其中就包括判断是否存在root弱口令, 如果服务器数量很多一一修改的话的确是要好花费不少时间精力的.如果通过脚本来实现密码更改, 再做一个定期 ...

  6. Linux系统Apache服务 - 配置 HTTP 的虚拟机主机

    接Linux系统Apache服务 - 配置HTTP的默认主页 1.创建/srv目录,作为httpd的文件目录,并创建/srv/default/www和/srv/www1.example.com/www ...

  7. (原) ubuntu下用pycharm2016.1专业版配docker编译环境(docker Interpreter)

    一:先创建docker-machine 先创建docker machine.我主机上的虚拟机是virtualbox.$ docker-machine create --driver virtualbo ...

  8. 【驱动】DM9000网卡驱动分析

    Preface    内核源码版本:linux-2.6.18    网卡驱动·linux内核网络分层结构:http://infohacker.blog.51cto.com/6751239/122114 ...

  9. sbt编译spark程序提示value toDF is not a member of Seq()

    sbt编译spark程序提示value toDF is not a member of Seq() 前提 使用Scala编写的Spark程序,在sbt编译打包的时候提示value toDF is no ...

  10. Beginning SDL 2.0(5) 基于MFC和SDL的YuvPlayer

    本文是在“Beginning SDL 2.0(4) YUV加载及渲染”(以下简称BS4)基础上做的功能完善,如果你对之间介绍的内容了解不多,麻烦先阅读之前的内容. 本文主要介绍如何完成一个基于MFC和 ...