91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

H5如何實現圖片壓縮與上傳功能

發布時間:2021-07-24 11:18:09 來源:億速云 閱讀:170 作者:小新 欄目:web開發

這篇文章主要為大家展示了“H5如何實現圖片壓縮與上傳功能”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“H5如何實現圖片壓縮與上傳功能”這篇文章吧。

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 }); 
 };
壓縮完成會得到

類似這樣的圖片:

H5如何實現圖片壓縮與上傳功能

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);

同一張圖片,這兩者獲取到的字符串大小不一樣,但圖片質量我是分辨不出什么差別。

H5如何實現圖片壓縮與上傳功能

比如一個2M的圖片,通過getBase64Image方法讀到的字符串大小才64k,而src直接讀取到的卻是270k,各自生成的圖片更小。一下分別是原圖(2.2M),base64(48k),src(202k)對應的圖片。

H5如何實現圖片壓縮與上傳功能H5如何實現圖片壓縮與上傳功能H5如何實現圖片壓縮與上傳功能

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);
    },

以上是“H5如何實現圖片壓縮與上傳功能”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

凤凰县| 体育| 磴口县| 莱州市| 烟台市| 抚州市| 富川| 昭平县| 娄底市| 句容市| 苍梧县| 密云县| 焦作市| 中宁县| 双辽市| 岑巩县| 阿图什市| 东乡县| 淮滨县| 武邑县| 滁州市| 兴城市| 桦川县| 西乌珠穆沁旗| 博爱县| 南昌县| 武强县| 包头市| 宁夏| 台前县| 太和县| 海城市| 前郭尔| 定日县| 乐陵市| 河西区| 将乐县| 延川县| 克山县| 新安县| 都安|