百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>html5教程> H5实现图片紧缩与上传-
分享文章到:

H5实现图片紧缩与上传-

发布时间:09/01 来源:未知 浏览: 关键词:
这篇文章主要为大家细致介绍了H5图片紧缩与上传的实例,拥有一定的参照 价值,感乐趣的小同伴们可以参照 一下 这篇文章主要为大家细致介绍了H5图片紧缩与上传的实例,拥有一定的参照 价值,感乐趣的小同伴们可以参照 一下

接到需求,问前端可否可以紧缩图片?由于有的图片太大,传到办事器上再紧缩太慢了。意识里没有这么玩过,早上老大丢来一个知乎链接,一看,本来先辈们已经用canvas实现了(为本人的知识惭愧3秒钟,再即将开干)!。

canvas紧缩

运用了github上的一个现成库:https://github.com/stomita/ios-imagefile-megapixel,不得不膜拜下stomita这位大神。大体的思绪是将图片抽样显示在canvas上,然后用通过canvas.toDataURL办法得到base64字符串来实现紧缩。比方在input元素触发change事件之后,读取里面的文件进行操纵:

var fileInput = document.getElementById('fileInput');
 fileInput.onchange = function() {
 var file = fileInput.files[0];
 // 新建一个紧缩对象,该结构函数接收file或者blob。
 var mpImg = new MegaPixImage(file);

 // render办法的maxWith,maxHeight,以及quality都决议了紧缩图片的质量
 var resImg = document.getElementById('resultImage');
 mpImg.render(resImg, { maxWidth: 300, maxHeight: 300, quality: 0.5 }); 
 };
紧缩完成会得到

相似这样的图片:

data:image/jpeg 这样的格局已经利用的许多了,许多样式里面的配景图片直接就是这样。

需要注明的是有两点,这里的resImg是一个预览图片,是已经存在于文档中的,要是你不需要预览,而只是新建一个img用来紧缩(document.createElement("img")),这会少一个tagName属性。你可以修改源码或者本人加上这个属性。源码中会依据tagName进行推断,不存在的话会报错:

 MegaPixImage.prototype.render = function (target, options, callback) {
  //....
  target.tagName = target.tagName || "IMG"; //加上这一句
  var tagName = target.tagName.toLowerCase();
  if (tagName === 'img') {
   target.src = renderImageToDataURL(this.srcImage, opt, doSquash);
  } else if (tagName === 'canvas') {
   renderImageToCanvas(this.srcImage, target, opt, doSquash);
  }
  if (typeof this.onrender === 'function') {
   this.onrender(target);
  }
  if (callback) {
   callback();
  }
  if (this.blob) {
   this.blob = null;
   URL.revokeObjectURL(this.srcImage.src);
  }
 };

别的这是一个耗时的操纵,要是是多张图片进行紧缩,不克不及直接调取,需要略微变换一下,否则会致使前面的图片没有紧缩完成就进入到了背面的图片。

 fileSelected: function () {
     var files = $("#fileImage")[0].files;
     var count = files.length;
     console.log("共有" + count + "个文件");
     for (var i = 0; i < count; i++) {var item = files[i];
      console.log("原图片大小", item.size);
      if (item.size > 1024 * 1024 * 2) {
       console.log("图片大于2M,开端进行紧缩...");

       (function(img) {
        var mpImg = new MegaPixImage(img);
        var resImg = document.createElement("img");
        resImg.file = img;
        mpImg.render(resImg, { maxWidth: 500, maxHeight: 500, quality: 1 }, function() {
         //do some thing
        });
       })(item);

      } 
      core.previewImage(item);
     }
    },

上传处置

1.直接post base64字符串

 uploadBase64str: function (base64Str) {
     var formdata = new FormData();
     formdata.append("base64str", base64Str);
     var xhr = new XMLHttpRequest();
     xhr.upload.addEventListener("progress", function (e) {
      var percentComplete = Math.round(e.loaded * 100 / e.total);
      para.onProgress(percentComplete.toString() + '%');
     });
     xhr.addEventListener("load", function (e) {
      para.uploadComplete(xhr.responseText);
     });
     xhr.addEventListener("error", function (e) {
      para.uploadError(e);
     });

     xhr.open("post", para.base64strUrl, true);
     xhr.send(formdata);
    },

比方这里base64strUrl是/home/MUploadImgBase64Str,MVC控制器办法如下:

 [HttpPost]
  public ActionResult MUploadImgBase64Str(string base64str)
  {
   try
   {
    var imgData = base64str.Split(',')[1];
    //过滤特别字符即可 
    string dummyData = imgData.Trim().Replace("%", "").Replace(",", "").Replace(" ", "+");
    if (dummyData.Length % 4 > 0)
    {
     dummyData = dummyData.PadRight(dummyData.Length + 4 - dummyData.Length % 4, '=');
    }
    byte[] byteArray = Convert.FromBase64String(dummyData);
    using (System.IO.MemoryStream ms = new System.IO.MemoryStream(byteArray))
    {
     var img = System.Drawing.Image.FromStream(ms);

     var path = "~/Content/UploadFiles/mobile/";
     var uploadpath = Server.MapPath(path);
     if (!Directory.Exists(uploadpath))
     {
      Directory.CreateDirectory(uploadpath);
     }
     var saveName = uploadpath + “stoneniqiu” + ".jpg";
     img.Save(saveName);
     return Json(saveName);
    }
   }
   catch (Exception e)
   {
    return Json(e.Message);

   }
  }

几M的图片能紧缩到几十k或者几百k,固然,要是宽度、高度和质量设定的太小,图片就会很失真了。这个字符串怎么猎取呢?有两个办法,一个是直接读取src:

var base641 = resImg.src;

一个是用canvas转换:

 function getBase64Image(img) {
    var canvas = document.createElement("canvas");
    canvas.width = img.width;
    canvas.height = img.height;

    var ctx = canvas.getContext("2d");
    ctx.drawImage(img, 0, 0, img.width, img.height);

    var dataURL = canvas.toDataURL("image/jpeg");
    return dataURL;

    // return dataURL.replace("data:image/png;base64,", "");
   }
 var base64 = getBase64Image(resImg);

统一张图片,这两者猎取到的字符串大小不同,但图片质量我是辨论不出什么差别。

getBase64Image通过canvas的toDataURL 猎取到更小的base64字符串。

2.也可以在前端转换blob对象,再post到后端

 function dataURItoBlob(dataUrl) {
    
    var byteString = atob(dataUrl.split(',')[1]);

    var ab = new ArrayBuffer(byteString.length);
    var ia = new Uint8Array(ab);
    for (var i = 0; i < byteString.length; i++) {
     ia[i] = byteString.charCodeAt(i);
    }
    return new Blob([ab], { type: 'image/jpeg' });
   }

3.不紧缩的就直接装到formdata中,send到后台。

 uploadFile: function (file) {
     console.log("开端上传");
     var formdata = new FormData();

     formdata.append(para.filebase, file);//这个名字要和mvc后台配合

     var xhr = new XMLHttpRequest();
     xhr.upload.addEventListener("progress", function (e) {

      var percentComplete = Math.round(e.loaded * 100 / e.total);
      para.onProgress(percentComplete.toString() + '%');
     });
     xhr.addEventListener("load", function (e) {
      para.uploadComplete(xhr.responseText);
     });
     xhr.addEventListener("error", function (e) {
      para.uploadError(e);
     });

     xhr.open("post", para.url, true);
 
     xhr.send(formdata);
    },

以上就是本文的全部内容,但愿对大家的学习有所帮忙,更多相干内容请关注百分百源码网!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有150人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板