• 基于html5 canvas 的客户端异步上传图片的插件,支持客户端压缩图片尺寸


      1 /**
      2  * Created by xx on 15-05-28.
      3  * 基于html5 canvas 的客户端异步上传画片的插件
      4  * 在实际应用中,常常要用于上传图片的功能.在现在越来越多的手机webapp应用中,上传图片功能的问题尤为实出,
      5  * 主要表显为:1 手机摄象头太牛B,随便拍拍,照片都有几M
      6  *       2 在没有wifi的情况下,移动网络上线照片还是有点慢的
      7  * 解决以上问题,主要的思路还是在客户端压缩图片尺寸,这就用到这个插件了
      8  *
      9  * 插件中的核心代码参照网络,自己整理了一下
     10  *
     11  * 使用方法
     12  * $("#xxfile").xxUploadImg({
     13                 url: 'upload.php', //上传服务器url
     14                 max: 100, // 上传图片的高或宽(大的那个)的最大值 ,当此值为0时,不压缩
     15                 fileType: 'image/png', //文件格式: image/png image/jpeg   经测试在微信中 jpeg无效
     16                 param: false, //因为上传是异步的,这里是 需要传递的参数 
     17                 callbackFun: function (ret, param) { // 上传成功后的回调函数
     18                     $("#show_img").attr("src", ret);
     19                 }
     20             })
     21  */
     22 
     23 
     24 (function ($) {
     25     $.fn.xxUploadImg = function (options) {
     26         if (typeof options == "string") {
     27             options = {"fileId": options};
     28         }
     29         // build main options before element iteration
     30         var opts = $.extend({}, $.fn.xxUploadImg.defaults, options);
     31         return this.each(function () {
     32             var $this = $(this);
     33             // build element specific options
     34             var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
     35             o.fileObj = $this[0].files[0];
     36 
     37             // 获取 canvas DOM 对象
     38             o.canvas = document.getElementById(o.canvasId);
     39             if (!o.canvas) {
     40                 o.canvas = document.createElement("canvas");
     41                 o.canvas.style.display = "none";
     42             }
     43 
     44             // 获取 canvas的 2d 环境对象,
     45             // 可以理解Context是管理员,canvas是房子
     46             o.ctx = o.canvas.getContext("2d");
     47 
     48             loadImage(o);
     49         });
     50     }
     51 
     52     // 加载 图像文件(url路径)
     53     function loadImage(o) {
     54         //   var src = document.getElementById(o.fileId).files[0];
     55         // 过滤掉 非 image 类型的文件
     56         if (!o.fileObj.type.match(/image.*/)) {
     57             if (window.console) {
     58                 console.log("选择的文件类型不是图片: ", o.fileObj.type);
     59             } else {
     60                 window.confirm("只能选择图片文件");
     61             }
     62 
     63             return;
     64         }
     65 
     66         // 创建 FileReader 对象 并调用 render 函数来完成渲染.
     67         var reader = new FileReader();
     68         // 绑定load事件自动回调函数
     69         reader.onload = function (e) {
     70             // 调用前面的 render 函数
     71             render(e.target.result, o);
     72         };
     73         // 读取文件内容
     74         reader.readAsDataURL(o.fileObj);
     75     }
     76 
     77 
     78     // 渲染
     79     function render(src, o) {
     80         // 创建一个 Image 对象
     81         var image = new Image();
     82         // 绑定 load 事件处理器,加载完成后执行
     83         image.onload = function () {
     84 
     85             if (o.max > 0) {
     86                 if (image.height > image.width) {
     87                     // 如果高度超标
     88                     if (image.height > o.max) {
     89                         // 宽度等比例缩放 *=
     90                         image.width *= o.max / image.height;
     91                         image.height = o.max;
     92                     }
     93                 } else {
     94                     if (image.width > o.max) {
     95                         // 宽度等比例缩放 *=
     96                         image.height *= o.max / image.width;
     97                         image.width = o.max;
     98                     }
     99                 }
    100             }
    101 
    102             // canvas清屏
    103             o.ctx.clearRect(0, 0, o.canvas.width, o.canvas.height);
    104             // 重置canvas宽高
    105             // 这里是使用canvas一个坑,就是先要给canvas设置宽高,然后才可以调用旋转等操作
    106             o.canvas.width = image.width;
    107             o.canvas.height = image.height;
    108             // 将图像绘制到canvas上
    109             o.ctx.drawImage(image, 0, 0, image.width, image.height);
    110             // !!! 注意,image 没有加入到 dom之中
    111 
    112 
    113             upload(o);
    114         };
    115         // 设置src属性,浏览器会自动加载。
    116         // 记住必须先绑定事件,才能设置src属性,否则会出同步问题。
    117         image.src = src;
    118     };
    119 
    120 
    121     function upload(o) {
    122         //上传
    123         var dataurl = o.canvas.toDataURL(o.fileType);
    124         // 为安全 对URI进行编码
    125         // data%3Aimage%2Fpng%3Bbase64%2C 开头
    126         var imagedata = encodeURIComponent(dataurl);
    127         $.post(o.url,
    128             {
    129                 img: dataurl
    130             },
    131             function (ret) {
    132                 o.callbackFun(ret, o.param);
    133             })
    134     }
    135 
    136 
    137     $.fn.xxUploadImg.defaults = {
    138         fileObj: false, //file对象
    139 
    140         canvasId: 'xxcanvas', //canvas标签的ID
    141         canvas: false, //canvas标签的ID
    142         ctx: false, //canvas标签的ID
    143 
    144         url: '', //上传服务器url
    145         max: 0, //压缩图片尺寸大小
    146         fileType: 'image/png', //文件格式 image/png image/jpeg   经测试在微信中 jpeg无效
    147         param: false, //需要传递的参数
    148         callbackFun: function (ret, param) {
    149         } //回调函数
    150     }
    151 })(jQuery);

    源代码转自--http://git.oschina.net/opmetic/xxUploadImg

  • 相关阅读:
    20201208史逸霏第六章学习笔记
    第三章笔记
    实现ls
    mystat
    改进ls
    第十章笔记
    cat userlist
    第七、八章笔记
    mypwd
    类成员函数指针写入map里怎么才能调用它呢?转载
  • 原文地址:https://www.cnblogs.com/jasonoiu/p/xxUploadImg.html
Copyright © 2020-2023  润新知