zoukankan      html  css  js  c++  java
  • 基于h5的前端图片压缩工具

    var ImageResizer = function(opts) {
      var settings = {
        resizeMode: "auto", //压缩模式,总共有三种 auto,width,height auto表示自动根据最大的宽度及高度等比压缩,width表示只根据宽度来判断是否需要等比例压缩,height类似。
        dataSource: "", //数据源。数据源是指需要压缩的数据源,有三种类型,image图片元素,base64字符串,canvas对象,还有选择文件时候的file对象。。。
        dataSourceType: "image", //image base64 canvas
        maxWidth: 500, //允许的最大宽度
        maxHeight: 500, //允许的最大高度。
        onTmpImgGenerate: function(img) {}, //当中间图片生成时候的执行方法。。这个时候请不要乱修改这图片,否则会打乱压缩后的结果。
        success: function(resizeImgBase64, canvas) {

        } //压缩成功后图片的base64字符串数据。
      };
      var appData = {};
      $.extend(settings, opts);

      var innerTools = {
        getBase4FromImgFile: function(file, callBack) {

          var reader = new FileReader();
            reader.onload = function(e) {
              var base64Img = e.target.result;
              if(callBack) {
                callBack(base64Img);
              }
            };
            reader.readAsDataURL(file);
          },

    //--处理数据源。。。。将所有数据源都处理成为图片对象,方便处理。
    getImgFromDataSource: function(datasource, dataSourceType, callback) {
    var _me = this;
    var img1 = new Image();
    if(dataSourceType == "img" || dataSourceType == "image") {
    img1.src = $(datasource).attr("src");
    if(callback) {
    callback(img1);
    }
    } else if(dataSourceType == "base64") {
    img1.src = datasource;
    if(callback) {
    callback(img1);
    }
    } else if(dataSourceType == "canvas") {
    img1.src = datasource.toDataURL("image/jpeg");
    if(callback) {
    callback(img1);
    }
    } else if(dataSourceType == "file") {
    _me.getBase4FromImgFile(function(base64str) {
    img1.src = base64str;
    if(callback) {
    callback(img1);
    }
    });
    }
    },

    //计算图片的需要压缩的尺寸。当然,压缩模式,压缩限制直接从setting里面取出来。
    getResizeSizeFromImg: function(img) {
    var _img_info = {
    w: $(img)[0].naturalWidth,
    h: $(img)[0].naturalHeight
    };

    var _resize_info = {
    w: 0,
    h: 0
    };

    if(_img_info.w <= settings.maxWidth && _img_info.h <= settings.maxHeight) {
    return _img_info;
    }
    if(settings.resizeMode == "auto") {
    var _percent_scale = parseFloat(_img_info.w / _img_info.h);
    var _size1 = {
    w: 0,
    h: 0
    };
    var _size_by_mw = {
    w: settings.maxWidth,
    h: parseInt(settings.maxWidth / _percent_scale)
    };
    var _size_by_mh = {
    w: parseInt(settings.maxHeight * _percent_scale),
    h: settings.maxHeight
    };
    if(_size_by_mw.h <= settings.maxHeight) {
    return _size_by_mw;
    }
    if(_size_by_mh.w <= settings.maxWidth) {
    return _size_by_mh;
    }

    return {
    w: settings.maxWidth,
    h: settings.maxHeight
    };
    }
    if(settings.resizeMode == "width") {
    if(_img_info.w <= settings.maxWidth) {
    return _img_info;
    }
    var _size_by_mw = {
    w: settings.maxWidth,
    h: parseInt(settings.maxWidth / _percent_scale)
    };
    return _size_by_mw;
    }
    if(settings.resizeMode == "height") {
    if(_img_info.h <= settings.maxHeight) {
    return _img_info;
    }
    var _size_by_mh = {
    w: parseInt(settings.maxHeight * _percent_scale),
    h: settings.maxHeight
    };
    return _size_by_mh;
    }
    },

    //--将相关图片对象画到canvas里面去。
    drawToCanvas: function(img, theW, theH, realW, realH, callback) {

    var canvas = document.createElement("canvas");
    canvas.width = theW;
    canvas.height = theH;
    var ctx = canvas.getContext('2d');
    ctx.drawImage(img,
    0, //sourceX,
    0, //sourceY,
    realW, //sourceWidth,
    realH, //sourceHeight,
    0, //destX,
    0, //destY,
    theW, //destWidth,
    theH //destHeight
    );

    //--获取base64字符串及canvas对象传给success函数。
    var base64str = canvas.toDataURL("image/png");
    if(callback) {
    callback(base64str, canvas);
    }
    }
    };

    //--开始处理。
    (function() {
    innerTools.getImgFromDataSource(settings.dataSource, settings.dataSourceType, function(_tmp_img) {
    var __tmpImg = _tmp_img;
    settings.onTmpImgGenerate(_tmp_img);

    //--计算尺寸。
    var _limitSizeInfo = innerTools.getResizeSizeFromImg(__tmpImg);
    var _img_info = {
    w: $(__tmpImg)[0].naturalWidth,
    h: $(__tmpImg)[0].naturalHeight
    };

    innerTools.drawToCanvas(__tmpImg, _limitSizeInfo.w, _limitSizeInfo.h, _img_info.w, _img_info.h, function(base64str, canvas) {
    settings.success(base64str, canvas);
    });
    });
    })();

    var returnObject = {

    };

    return returnObject;
    };

    function dataURLtoBlob(dataurl) {
    var arr = dataurl.split(','),
    mime = arr[0].match(/:(.*?);/)[1],
    bstr = atob(arr[1]),
    n = bstr.length,
    u8arr = new Uint8Array(n);
    while(n--) {
    u8arr[n] = bstr.charCodeAt(n);
    }
    return new Blob([u8arr], {
    type: mime
    });
    }

    /*******************************************************************************************************************************************************************************************/

    //图片的压缩插件调用
    var _ir=ImageResizer({
    resizeMode:"auto",
    dataSource:this.result,
    dataSourceType:"base64",
    maxWidth:120, //允许的最大宽度
    maxHeight:120, //允许的最大高度。
    onTmpImgGenerate:function(img){
    },
    success:function(resizeImgBase64,canvas){
    $(parent).find("img").attr("src",resizeImgBase64);
    }
    });

    };
    reader.readAsDataURL(this.files[i]);
    }
    }

    /*******************************************************************************************************************************************************************************************/

    原文链接:https://www.cnblogs.com/sunny0120/p/6606398.html

  • 相关阅读:
    浅拷贝在项目中的应用
    MVC3中使用AuthorizeAttribute特性来完成登陆权限的验证
    一个面向对象的JS例子,很好的支持了开闭原则(不要重复你昨天的代码)
    c++学习笔记5
    JS跨域访问操作iframe
    Select函数
    MacOS10.8.3+Xcode4.6+IOS6.1 编译FFmpeg,简单使用
    eclipse部署,在tomcat中找不到eclipse发布的项目。eclipse更改项目发布路径
    初识Volley(二)
    MySQL 5.0 迁移到 MariaDB 10.0.2 存储过程无法迁移
  • 原文地址:https://www.cnblogs.com/Forever-0209/p/13372327.html
Copyright © 2011-2022 走看看