H5 调用本地相机并压缩上传(是从angular的ionic项目中截取的)

html部分

 1   <div class="list_upload item bg_white">
 2     <div class="itemImg pic_upload" ng-repeat="item in thumb">
 3         <!-- 采用angular循环的方式,对存入thumb的图片进行展示 -->
 4           <img ng-src="{{item.imgSrc}}" alt=""/>
 5           <span class="itemImgClose" ng-if="item.imgSrc" ng-click="img_del($index)"><i class="ion-android-close"></i></span>
 6       </div>
 7       <div class="item_file" ng-repeat="item in thumb_default" ng-if="addImg">
 8            <!-- 这里之所以写个循环,是为了后期万一需要多个‘加号’框 -->
 9            <div class="item pic_upload"> <i class="icon ion-android-add"></i>
10              添加图片<input type="file" id="one-input"  accept="image/*" file-model="images" onchange="angular.element(this).scope().img_upload(this.files)"/>
11          </div>
12      </div>
13  </div>

js部分

      $scope.reader = new FileReader();   //创建一个FileReader接口
      $scope.thumb = {};      //用于存放图片的base64
      $scope.imagNmae = [];
      //监听照片的变化
      console.log($scope.thumb);
      $scope.thumb_default = {    //用于循环默认的‘加号’添加图片的框
        1111:{}
      };
      //用于压缩图片的canvas
      var canvas = document.createElement("canvas");
      var ctx = canvas.getContext(‘2d‘);
      //瓦片canvas
      var tCanvas = document.createElement("canvas");
      var tctx = tCanvas.getContext("2d");
      //ionic post请求头部
      var transFn = function (obj) {
          return $httpParamSerializerJQLike(obj);
        },
        postCfg = {
          headers: {‘Content-Type‘: ‘application/x-www-form-urlencoded; charset=UTF-8‘},
          transformRequest:transFn
        };
      var flag = 0; //标志位
      $scope.addImg = true;
      var maxSize = 100*1024; //图片大小为100kb
      $scope.img_upload = function(files) {       //单次提交图片的函数
        flag++;
        var size = files[0].size / 1024 > 1024 ? (~~(10 * files[0].size / 1024 / 1024)) / 10 + "MB" : ~~(files[0].size / 1024) + "KB";
        $scope.guid = (new Date()).valueOf();   //通过时间戳创建一个随机数,作为键名使用
        $scope.reader.readAsDataURL(files[0]);  //FileReader的方法,把图片转成base64
        $scope.reader.onload = function (ev) {
          $scope.$apply(function () {
            $scope.thumb[$scope.guid] = {
              imgSrc: ev.target.result,  //接收base64
            }
          });
          //上传图片的调用
          var result = this.result;
          var img = new Image();
          img.src = result;
          if (result.length <= maxSize) {
            upload(result, files[0].type);
            return;
          }
          //图片加载完毕之后进行压缩,然后上传
          if (img.complete) {
            callback();
          } else {
            img.onload = callback;
          }
          function callback() {
            var data = compress(img);
            upload(data, files[0].type);
            img = null;
          }
        };
        //判断图片的数量
        if(flag >= 3){
          $scope.addImg = false;
        }
      };

      $scope.img_del = function(key) {    //删除,删除的时候thumb和form里面的图片数据都要删除,避免提交不必要的
        flag--;
        console.log(key);
        var guidArr = [],ImgId = [];
        for(var p in $scope.thumb){
          guidArr.push(p);
        }
        delete $scope.thumb[guidArr[key]]; //删除图片
        for(var s in $scope.imagNmae){
          ImgId.push(s);
        }
        delete $scope.imagNmae[ImgId[key]]; //删除图片id
        if(flag < 3){
          $scope.addImg = true;
        }
      };

       //使用canvas对大图片进行压缩
      var compress = function(img) {
        var initSize = img.src.length;
        var width = img.width;
        var height = img.height;
        //如果图片大于四百万像素,计算压缩比并将大小压至400万以下
        var ratio;
        if ((ratio = width * height / 4000000) > 1) {
          ratio = Math.sqrt(ratio);
          width /= ratio;
          height /= ratio;
        } else {
          ratio = 1;
        }
        canvas.width = width;
        canvas.height = height;
        //铺底色
        ctx.fillStyle = "#fff";
        ctx.fillRect(0, 0, canvas.width, canvas.height);
        //如果图片像素大于100万则使用瓦片绘制
        var count;
        if ((count = width * height / 1000000) > 1) {
          count = ~~(Math.sqrt(count) + 1); //计算要分成多少块瓦片
          //计算每块瓦片的宽和高
          var nw = ~~(width / count);
          var nh = ~~(height / count);
          tCanvas.width = nw;
          tCanvas.height = nh;
          for (var i = 0; i < count; i++) {
            for (var j = 0; j < count; j++) {
              tctx.drawImage(img, i * nw * ratio, j * nh * ratio, nw * ratio, nh * ratio, 0, 0, nw, nh);
              ctx.drawImage(tCanvas, i * nw, j * nh, nw, nh);
            }
          }
        } else {
          ctx.drawImage(img, 0, 0, width, height);
        }
        //进行最小压缩
        var ndata = canvas.toDataURL(‘image/jpeg‘, 0.1);
        //console.log(‘压缩前:‘ + initSize);
        // console.log(‘压缩后:‘ + ndata.length);
        //console.log(‘压缩率:‘ + ~~(100 * (initSize - ndata.length) / initSize) + "%");
        tCanvas.width = tCanvas.height = canvas.width = canvas.height = 0;
        return ndata;
      };
     //图片上传,
      var upload = function (basestr,type) {
        var text = basestr.split(",")[1]; //截取图片字节流
        var obj = {
          "参数名":"参数"
        };
        $http.post("接口链接",obj,postCfg).success(function (data) {

        }).error(function(err){
          $scope.loadMore = true;
          $ionicLoading.show({
            template: "无法加载数据。请稍后再试。",
            duration: 2000
          });
        });
      };

效果展示

参考友情链接:

1、https://github.com/whxaxes/node-test/blob/master/server/upload/index_2.html

2、https://github.com/whxaxes/node-test/blob/master/server/upload/upload_2.js

3、http://www.cnblogs.com/jach/p/5734920.html

时间: 2024-08-24 15:53:42

H5 调用本地相机并压缩上传(是从angular的ionic项目中截取的)的相关文章

基于H5+ API手机相册图片压缩上传

// 母函数 function App(){} /** * 图片压缩,默认同比例压缩 * @param {Object} path * pc端传入的路径可以为相对路径,但是在移动端上必须传入的路径是照相图片储存的绝对路径 * @param {Object} obj * obj 对象 有 width, height, quality(0-1) * @param {Object} callback * 回调函数有一个参数,base64的字符串数据 */ App.prototype.dealImage

HTML5 图片本地压缩上传插件

======================前端代码========================= <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>localResizeIMG</title> <!--引入JQuery 用于异步上传图片--> <script type="text/javascript"

Html5+asp.net mvc 图片压缩上传

在做图片上传时,大图片如果没有压缩直接上传时间会非常长,因为有的图片太大,传到服务器上再压缩太慢了,而且损耗流量. 思路是将图片抽样显示在canvas上,然后用通过canvas.toDataURL方法得到base64字符串来实现压缩. 废话不多少不多说直接看代码: 本次测试使用了 zepto.min.js 插件,更新版本的下载请点击这里 主要js代码: //图片压缩处理 ; (function () { /** * 加载的时候进行抽样检测 * 在iOS中,大于2M的图片会抽样渲染 */ func

前端图片压缩上传(纯js的质量压缩,非大小压缩)

此demo为大于1M对图片进行压缩上传 若小于1M则原图上传,可以根据自己实际需求更改. demo源码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>XMLHttpRequest上传文件</title> <script type="text/javascript"> /* 三个参数 file:一个是文件(

android图片压缩上传系列-service篇

本篇文章是继续上篇android图片压缩上传系列-基础篇文章的续篇.主要目的是:通过Service来执行图片压缩任务来讨论如何使用Service,如何处理任务量大的并发问题. 了解下Service 大家都知道如果有费时任务,这时需要将任务放到后台线程中执行,如果对操作的结果需要通过ui展示还需要在任务完成后通知前台更新.当然对于这种情况,大家也可以在Activity中启动线程,在线程中通过Handler和sendMessage来通知Activity并执行更新ui的操作,但是更好的方法是将这些操作

前端图片压缩上传(纯js的质量压缩,非长宽压缩)

原文: 此demo为大于1M对图片进行压缩上传 若小于1M则原图上传,可以根据自己实际需求更改. demo源码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>XMLHttpRequest上传文件</title> <script type="text/javascript"> /* 三个参数 file:一个

【方法】如何实现图片压缩上传

[参考文章] 前端实现图片压缩上传功能 H5实现图片先压缩再上传 原文地址:https://www.cnblogs.com/wannananana/p/12050442.html

JAVA基础知识之InputStreamReader流 和 将本地文件通过前端上传到服务器上

将本地文件通过前端上传到服务器上 public BaseResponseSwagger resolveFile(@Valid @ApiParam(value = "file")@RequestParam(name = "file",required = true) MultipartFile file){ if(file.isEmpty()){ throw new SoftwareException(ComStatusCodeEnum.COM_PARAM_VALID

纯原生js移动端图片压缩上传插件

前段时间,同事又来咨询一个问题了,说手机端动不动拍照就好几M高清大图,上传服务器太慢,问问我有没有可以压缩图片并上传的js插件,当然手头上没有,别慌,我去网上搜一搜. 结果呢,呵呵...诶~又全是基于jquery.zepto的(这句话似乎吐槽次数太多了...),然后我也就不吐槽了, 然后当然是自己做了,先上图: 纯原生js的移动端图片压缩上传插件,不依赖任何库 用法 在html页面中引入input标签,通过自定义属性data-LUploader绑定点击触发的标签id,写法如下: <div cla