国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > HTML > 正文

用HTML5實現圖片壓縮與上傳

2020-03-24 18:13:17
字體:
來源:轉載
供稿:網友
這次給大家帶來用HTML5實現圖片壓縮與上傳,HTML5實現圖片壓縮與上傳的注意事項有哪些,下面就是實戰案例,一起來看一下。

canvas壓縮

使用了github上的一個現成庫:https://github.com/stomita/ios-imagefile-megapixel,不得不膜拜下stomita這位大神。大體的思路是將圖片抽樣顯示在canvas上,然后用通過canvas.toDataURL方法得到base64字符串來實現壓縮。比如在input元素觸發change事件之后,讀取里面的文件進行操作:

 fileInput = document.getElementById('fileInput'=  file = fileInput.files[0     mpImg =      resImg = document.getElementById('resultImage'

壓縮完成會得到類似這樣的圖片:

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]        html' target='_blank'>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);

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

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

getBase64Image通過canvas的toDataURL 獲取到更小的base64字符串。

2.也可以在前端轉換blob對象,再post到后端

                  byteString = atob(dataUrl.split(',')[1 ab =  ia =  ( i = 0; i < byteString.length; i++=  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);                },

相信看了本文案例你已經掌握了方法,更多精彩請關注 其它相關文章!

推薦閱讀:

怎樣阻止JS的冒泡和瀏覽器的默認行為

js與canvas合成圖片做出微信公眾號海報功能

checkbox在jQuery中的使用

DataTable插件可以實現異步加載嗎?

以上就是用HTML5實現圖片壓縮與上傳的詳細內容,更多請關注 其它相關文章!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 黎川县| 左贡县| 崇阳县| 边坝县| 壤塘县| 通化县| 河北区| 苍南县| 黔西县| 时尚| 枞阳县| 承德市| 衡山县| 钦州市| 蒙自县| 贺兰县| 云浮市| 黄梅县| 深圳市| 杨浦区| 和顺县| 东方市| 晋州市| 博野县| 东明县| 财经| 图木舒克市| 秭归县| 湘潭县| 永康市| 岳普湖县| 十堰市| 吴桥县| 佳木斯市| 深圳市| 育儿| 莎车县| 依兰县| 余庆县| 鲁甸县| 泰安市|