在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 應用軟件教程 > 詳細頁面

HTML5完成圖片壓縮上傳技巧的深度解析

HTML5完成圖片壓縮上傳技巧的深度解析

更新時間:2025-09-30 文章作者:未知 信息來源:網絡 閱讀次數:

微信小程序,簡稱小程序,英文名Mini Program,是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或搜一下即可打開應用。小程序是一種不用下載就能使用的應用,也是一...
微信小程序,簡稱小程序,英文名Mini Program,是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或搜一下即可打開應用。小程序是一種不用下載就能使用的應用,也是一項門檻非常高的創新,經過將近兩年的發展,已經構造了新的小程序開發環境和開發者生態。
下面小編就為大家帶來一篇深入研究HTML5實現圖片壓縮上傳功能。小編覺得挺不錯的,現在分享給大家。也給大家一個參考,一起跟隨小編過來看看吧

上篇文章中提到移動端上傳圖片,我們知道現在流量還是挺貴的,手機的像素是越來越高,拍個照動不動就是好幾M,傷不起。雖然客戶端可以輕輕松松實現圖片壓縮再上傳,但是我們的應用還可能在瀏覽器里面打開,怎么辦呢,圖片壓縮。受以前PC上的開發思維影響,尼瑪js哪有權限去操作文件,哪有資格壓縮圖片啊,搞不了,你們客戶端去整吧。只能說自己還是有些井底之蛙了。在HTML5的影響下,前端能干的事情越來越多了,開發的功能逼格也越來越高了,H5萬歲!前端的魅力也在這,過去不可能的并不意味現在、以后不可能,努力吧,騷年!

js怎么壓縮圖片???潛意識里確實一開始是覺得實現不了,后來翻閱資料,研究了下,發現可行!搞起!

先說說H5以前我們怎么上傳,一般是借助插件、flash或者干脆一個文件form表單,少操不少心。

自從有了H5,老板再也不擔心我的開發了。

上篇文章提到圖片上傳用到了FileReader,FormData,實際上主要用這兩個我們基本能實現圖片的預覽和上傳了。實現圖片壓縮,我們需要借助canvas,是的,就是canvas!

大致思路是:

1、創建一個圖片和一個canvas


XML/HTML Code復制內容到剪貼板

  1. var image = new Image(),   
    canvas = document.createElement("canvas"),   
    ctx = canvas.getContext('2d');

2、我們將input中選擇的圖片地址通過FileReader獲取后賦給新建的圖片對象,然后將圖片對象丟到canvas畫布上。


XML/HTML Code復制內容到剪貼板

  1. var file = obj.files[0];   
                            var reader = new FileReader();//讀取客戶端上的文件   
                            reader.onload = function() {   
                                var url = reader.result;//讀取到的文件內容.這個屬性只在讀取操作完成之后才有效,并且數據的格式取決于讀取操作是由哪個方法發起的.所以必須使用reader.onload,   
                                image.src=url;//reader讀取的文件內容是base64,利用這個url就能實現上傳前預覽圖片   
                                ...   
                            };   
                            image.onload = function() {   
                                var w = image.naturalWidth,   
                                    h = image.naturalHeight;   
                                canvas.width = w;   
                                canvas.height = h;   
                                ctx.drawImage(image, 0, 0, w, h, 0, 0, w, h);   
                                fileUpload();   
                            };   
                            reader.readAsDataURL(file);

這里需要注意的是,canvas將圖片畫到畫布上的時候需要確定canvas的尺寸,同時設定好drawImage的參數,具體如下:


XML/HTML Code復制內容到剪貼板

  1. void ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);

HTML5實現圖片壓縮上傳功能的深度解析

dx源圖像的左上角在目標canvas上 X 軸的位置。

dy源圖像的左上角在目標canvas上 Y 軸的位置。

dWidth在目標canvas上繪制圖像的寬度。 允許對繪制的圖像進行縮放。 如果不說明, 在繪制時圖片寬度不會縮放。

dHeight在目標canvas上繪制圖像的高度。 允許對繪制的圖像進行縮放。 如果不說明, 在繪制時圖片高度不會縮放。

sx需要繪制到目標上下文中的,源圖像的矩形選擇框的左上角 X 坐標。

sy需要繪制到目標上下文中的,源圖像的矩形選擇框的左上角 Y 坐標。

sWidth需要繪制到目標上下文中的,源圖像的矩形選擇框的寬度。如果不說明,整個矩形從坐標的sx和sy開始,到圖像的右下角結束。

sHeight需要繪制到目標上下文中的,源圖像的矩形選擇框的高度。

為了上傳完整的圖片,這里dx,dy必須設置為0,dWidth和dHeight必須設置為原始圖片的寬度和高度。這就是為什么我們需要等image對象下載完畢后獲取其原始尺寸,這很關鍵!

3、圖片上傳


XML/HTML Code復制內容到剪貼板

  1. function fileUpload() {   
         var data = canvas.toDataURL("image/jpeg", quality);   
         //dataURL 的格式為 “data:image/png;base64,****”,逗號之前都是一些說明性的文字,我們只需要逗號之后的就行了   
        datadata = data.split(',')[1];   
        data = window.atob(data);   
        var ia = new Uint8Array(data.length);   
        for (var i = 0; i < data.length; i++) {   
              ia[i] = data.charCodeAt(i);   
        };   
         //canvas.toDataURL 返回的默認格式就是 image/png   
        var blob = new Blob([ia], {   
         type: "image/jpeg"   
        });   
        var fd = new FormData();   
            fd.append('myFile', blob);   
        var xhr = new XMLHttpRequest();   
        xhr.addEventListener("load", opts.success, false);   
        xhr.addEventListener("error", opts.error, false);   
        xhr.open("POST", opts.url);   
        xhr.send(fd);   
     }

這里用的關鍵方法是canvas.toDataURL


XML/HTML Code復制內容到剪貼板

  1. canvas.toDataURL(type, encoderOptions);

官方的說明是The HTMLCanvasElement.toDataURL() method returns a data URI containing a representation of the image in the format specified by the type parameter (defaults to PNG). The returned image is in a resolution of 96 dpi.實際上就是讀取canvas畫布上圖片的數據。其默認是png格式,如果第一個參數type是image/jpeg的話,第二個參數encoderOptions就可以用來設置圖片的壓縮質量,經過測試,如果是png格式,100%的寬高經過該方法還有可能使圖片變大~~~~適得其反,所以我們可以在canvas.drawImage的時候適當設置sWidth和sHeight,比如同比例縮小1.5倍等,圖片質量其實并不太影響查看,尤其對尺寸比較大的圖片來說。

上面還有比較陌生的方法atob,其作用是做解碼,因為圖片格式的base64.


XML/HTML Code復制內容到剪貼板

  1. var encodedData = window.btoa("Hello, world"); // encode a string

  2. var decodedData = window.atob(encodedData); // decode the string

該方法解碼出來可能是一堆亂碼,Uint8Array返回的是8進制整型數組。

Blob是存儲二進制文件的容器,典型的Blob對象是一個圖片或者聲音文件,其默認是PNG格式。


XML/HTML Code復制內容到剪貼板

  1. var blob = new Blob([ia], {

  2. type: "image/jpeg"

  3. });

最后通過ajax將Blob對象發送到server即可。

整個流程大致如上,但是~~~實現以后測試跑來說:“你不是說圖片壓縮了嗎,為什么圖片還是上傳那么慢!”,哥拿起手機對妹紙演示了一下,明明很快嘛,于是反道“是你手機不行或者網絡不好吧,你下載圖片看明明變小了,比之前肯定快,你看我秒傳”。呵呵,說歸說,還是偷偷檢查代碼,在瀏覽器中打時間log,對比沒壓縮之前的,尼瑪。。【尤徊趴炝藥装俸撩耄!折騰了半天,之前的代碼也重構了,玩我呢。

細心的大神看了上面的代碼估計能猜出問題在哪,沒錯,獲取本地圖片長寬尺寸的時候出了問題。

HTML5實現圖片壓縮上傳功能的深度解析

我去,獲取本地4M大小的圖片尺寸花了3174ms!!,圖片越大時間也越久~


JavaScript Code復制內容到剪貼板

  1. image.onload = function() {   
            var w = image.naturalWidth,   
              h = image.naturalHeight;   
            canvas.width = w / 1.5;   
            canvas.height = h / 1.5;   
            ctx.drawImage(image, 0, 0, w, h, 0, 0, w / 1.5, h / 1.5);   
            Upload.fileUpload(type);   
    };

瀏覽器在本地取圖片的時候是沒法直接像file.size一樣獲取其長寬的,只能通過FileReader拿到內容后賦值給新建的image對象,新建的image對象下載需要時間!怎么破?不就是獲取本地圖片的尺寸嗎,難道沒有別的辦法了?

于是想到了之前研究過的快速獲取圖片長寬的博文,點擊進入 ,demo地址:http://jsbin.com/jivugadure/edit?html,js,output,定時去查詢圖片加載過程中的高度或者寬度,不用等整個圖片加載完畢。

測了下,還是不行,因為定時查詢這種方法對常規的server返回的圖片有作用,這里圖片地址是base64,貌似時間還更久了~哭。


小結一下:

1、用HTML5來壓縮圖片上傳是可行的,在移動端我們不用依賴客戶端或者插件,目前主流瀏覽器支持程度已經很高了。

2、壓縮圖片一方面是想減少用戶上傳等待的時間,另外也減少用戶為此犧牲的流量,從整體時間來看,因為獲取圖片尺寸導致多一次下載需要耗時,其實壓不壓縮時間差別并不是特別大。除非大神們找到合適的方法能夠直接獲取圖片的尺寸,麻煩也告知我一聲,萬分感謝;

3、既然時間成本差不多,但是我們壓縮了圖片,減少了圖片的大小,減少了流量的消耗,存儲空間以及下次獲取該圖片的時間,所以還是值得的。

補充源代碼:


JavaScript Code復制內容到剪貼板

  1. (function($) {   
        $.extend($.fn, {   
            fileUpload: function(opts) {   
                this.each(function() {   
                    var $self = $(this);   
                    var quality = opts.quality ? opts.quality / 100 : 0.2;   
                    var dom = {   
                        "fileToUpload": $self.find(".fileToUpload"),   
                        "thumb": $self.find(".thumb"),   
                        "progress": $self.find(".upload-progress")   
                    };   
                    var image = new Image(),   
                        canvas = document.createElement("canvas"),   
                        ctx = canvas.getContext('2d');   
                    var funs = {   
                        setImageUrl: function(url) {   
                            image.src = url;   
                        },   
                        bindEvent: function() {   
                            console.log(dom.fileToUpload)   
                            dom.fileToUpload.on("change", function() {   
                                funs.fileSelect(this);   
                            });   
                        },   
                        fileSelect: function(obj) {   
                            var file = obj.files[0];   
                            var reader = new FileReader();   
                            reader.onload = function() {   
                                var url = reader.result;   
                                funs.setImageUrl(url);   
                                dom.thumb.html(image);   
                            };   
                            image.onload = function() {   
                                var w = image.naturalWidth,   
                                    h = image.naturalHeight;   
                                canvas.width = w;   
                                canvas.height = h;   
                                ctx.drawImage(image, 0, 0, w, h, 0, 0, w, h);   
                                funs.fileUpload();   
                            };   
                            reader.readAsDataURL(file);   
                        },   
                        fileUpload: function() {   
                            var data = canvas.toDataURL("image/jpeg", quality);   
                            //dataURL 的格式為 “data:image/png;base64,****”,逗號之前都是一些說明性的文字,我們只需要逗號之后的就行了 
                            data = data.split(',')[1];   
                            data = window.atob(data);   
                            var ia = new Uint8Array(data.length);   
                            for (var i = 0; i < data.length; i++) {   
                                ia[i] = data.charCodeAt(i);   
                            };   
                            //canvas.toDataURL 返回的默認格式就是 image/png 
                            var blob = new Blob([ia], {   
                                type: "image/jpeg"
                            });   
                            var fd = new FormData();   
                            fd.append('myFile', blob);   
                            var xhr = new XMLHttpRequest();   
                            xhr.addEventListener("load", opts.success, false);   
                            xhr.addEventListener("error", opts.error, false);   
                            xhr.open("POST", opts.url);   
                            xhr.send(fd);   
                        }   
                    };   
                    funs.bindEvent();   
                });   
            }   
        });   
    })(Zepto);

調用方式:


JavaScript Code復制內容到剪貼板

  1. $(".fileUpload").fileUpload({   
                    "url": "savetofile.php",   
                    "file": "myFile",   
                    "success":function(evt){   
                        console.log(evt.target.responseText)   
                    }   
    });

希望大家能找到更好的辦法,多多交流!感謝!

以上就是HTML5實現圖片壓縮上傳功能的深度解析的詳細內容,更多請關注php中文網其它相關文章!


小程序是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或者搜一下即可打開應用。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 99在线精品免费视频| 少妇性饥渴无码a区免费| 久草在在线视频| 免费拍拍拍网站| 久久99国产精品一区| 五月婷婷六月合| 国产精品少妇在线视频| 毛葺葺老太做受视频| 99色精品视频| 美女福利视频在线| 欧美日韩在线不卡视频| 毛片av免费在线观看| 日韩视频在线免费看| 蜜臀久久99精品久久久酒店新书| 各处沟厕大尺度偷拍女厕嘘嘘 | 欧美在线观看视频网站| 色综合久久久久无码专区| 欧美在线一区视频| 黄色www网站| 爆乳熟妇一区二区三区霸乳| 亚洲精品一二三四五区| 亚洲视频第二页| 一区二区三区四区久久| 精品丰满人妻无套内射| 国产精品沙发午睡系列| 天天操天天爱天天爽| 国产精品99久久久久久大便| a级黄色片免费| 欧美老熟妇喷水| 日本中文字幕观看| av一区二区三区免费观看| 噜噜噜久久亚洲精品国产品麻豆| 亚洲一区二区三区四区五区xx| 99热这里只有精品在线播放| 日韩成人精品视频在线观看| 黄色激情在线视频| 国产成人手机视频| 伊人再见免费在线观看高清版 | 黄色一级大片在线观看| 中文字幕一区久久| 欧美日韩成人免费视频| 天堂视频免费看| 久艹在线免费观看| 亚洲高清在线不卡| 免费午夜视频在线观看| 亚洲免费av网| 国产精品亚洲二区在线观看| 国产视频在线观看网站| 亚洲成人福利在线| 中国丰满人妻videoshd| 九一免费在线观看| 亚洲三级在线观看视频| 久久精品午夜福利| 霍思燕三级露全乳照| 好吊色这里只有精品| 日韩爱爱小视频| 成年人网站免费视频| 国产资源中文字幕| 亚欧美在线观看| 两根大肉大捧一进一出好爽视频| 亚洲一区 在线播放| www欧美激情| 91视频免费版污| 99999精品视频| 欧美一级在线看| 自慰无码一区二区三区| 无码熟妇人妻av在线电影| 国产女主播av| 国产尤物av一区二区三区| 99re6这里有精品热视频| 精品国产乱码久久久久久1区二区| 午夜免费一区二区| 国产一二三区av| 三级a三级三级三级a十八发禁止| wwwwxxxx日韩| 自拍偷拍21p| 在线播放免费视频| 免费久久久久久| 国产一区 在线播放| www.国产在线视频| av女优在线播放| 久久久久久久久久久视频| 日韩视频第二页| 麻豆一区二区三区视频| 15—17女人毛片| 一本—道久久a久久精品蜜桃| 午夜影院免费版| 日韩不卡视频一区二区| 国产精品无码免费专区午夜| 五月丁香综合缴情六月小说| 欧美成人免费在线观看视频| 日本一本二本在线观看| 97超碰人人爽| 国产a级黄色大片| 999香蕉视频| www亚洲国产| 国产视频九色蝌蚪| 男女视频在线看| 免费人成自慰网站| 久久午夜夜伦鲁鲁一区二区| 久久人人爽av| 日韩视频在线视频| 亚洲高清在线免费观看| 国产中文字幕乱人伦在线观看| 亚洲熟妇av日韩熟妇在线| 我看黄色一级片| 麻豆tv在线播放| 色噜噜狠狠永久免费| av一区二区三区免费观看| 又色又爽又高潮免费视频国产| 一本二本三本亚洲码| 2022亚洲天堂| 国产二区视频在线| 57pao国产成永久免费视频| 日韩中字在线观看| 青娱乐精品在线| 日本成人黄色网| 成人黄色av片| 国产片侵犯亲女视频播放| 狠狠操狠狠干视频| 日本成人黄色网| 国产深夜男女无套内射| 精品一二三四五区| 国产又爽又黄ai换脸| 日本中文字幕观看| 国产 porn| www.亚洲高清| 牛夜精品久久久久久久| 久久婷婷五月综合色国产香蕉| 欧美a级免费视频| 日韩精品久久一区二区| 亚洲欧美日韩网站| 思思久久精品视频| 中文字幕第38页| 99re6在线观看| 国产精品美女在线播放| 一级黄色片国产| 99re99热| 男人草女人视频| 成年人看的毛片| 国产av麻豆mag剧集| 黄色片网址在线观看| 国产精品网站免费| 成人午夜视频免费在线观看| 成人在线免费在线观看 | 精品亚洲一区二区三区四区| 日本www.色| 亚洲天堂网站在线| 色呦呦网站入口| 欧洲精品在线播放| 免费无码国产v片在线观看| 免费看的黄色大片| 欧美日韩中文不卡| 日本美女久久久| 99久久免费观看| 国产精品裸体瑜伽视频| 中文字幕在线导航| 国产高清免费在线| 国产无限制自拍| www.日本一区| 欧美国产视频一区| 日韩欧美在线免费观看视频| 色偷偷中文字幕| 日本a在线天堂| 男人舔女人下面高潮视频| 日本美女久久久| av天堂永久资源网| 久久久成人精品一区二区三区| 日韩欧美精品免费| www.色就是色.com| 欧美 日韩 激情| 欧美日韩理论片| 男人亚洲天堂网| 99久re热视频精品98| 国产成人久久777777| 精品国产无码在线| 天天操天天爱天天爽| 给我免费播放片在线观看| 婷婷激情四射五月天| 日韩日韩日韩日韩日韩| 婷婷中文字幕在线观看| 欧美黄网站在线观看| 久久久久亚洲av无码专区喷水| 国产精品wwwww| 久久久久久免费看| 911av视频| 亚洲精品久久久中文字幕| 各处沟厕大尺度偷拍女厕嘘嘘| 米仓穗香在线观看| 成 人 黄 色 小说网站 s色| 久久久999视频| 日韩a级黄色片| 少妇熟女一区二区| 拔插拔插华人永久免费| www.com黄色片| 不要播放器的av网站| 激情网站五月天| 国产免费成人在线| 成年人免费在线播放| 国产又大又硬又粗|