摘要:先上代碼獲取上傳和展現(xiàn)的圖片。解決辦法設(shè)定最大寬度,將圖片等比縮放,這樣子就少了向擴(kuò)展元素這部分的損耗。因此出了必須前端搞定,最好的方式,還是在后臺跑腳本運(yùn)行合并。
先上代碼先說背景:工作中遇到一個(gè)問題,file組件上傳圖片,file是可以上傳n張圖片;但是,后臺邏輯歷史原因,只能展現(xiàn)一張。因此:考慮到成本,決定在前端將多張圖片合并成一張給后端。
_mergeImage2Canvas:function() { // 獲取file上傳和展現(xiàn)的圖片。一般file上傳之后,有個(gè)小圖標(biāo)展現(xiàn)。 var imgs = $(".img_files"); if (!imgs) { return false; } // 創(chuàng)建原始圖像 // 原因:file上傳之后,展現(xiàn)往往是個(gè)縮略圖,無法取到真正大小 for (var i = 0; i < imgs.length; i++) { var fbwImg = document.createElement("img"); var fbwImgID = "temp_img_id" + i; $("#" + fbwImgID).remove(); fbwImg.src = imgs[i].src; fbwImg.className = "temp-img-class"; // 不顯示,僅供調(diào)用 fbwImg.style.display = "none"; // 臨時(shí)區(qū)域擴(kuò)展 $("#temp_section").append(fbwImg); } // 合并原始圖片,生成一個(gè)新的base64 圖片 var getOriginImgBase64 = function (oriImgs) { if (!oriImgs) { return false; } // 獲取canvas的寬高 // 原因:canvas需要首先指定寬高,所以需要提前獲取最終的寬高 var maxWidth = 0; var height = 0; for (var i = 0; i < oriImgs.length; i++) { var img = oriImgs[i]; if (img.width > maxWidth) { maxWidth = img.width; } height += img.height; } // 設(shè)定canvas var canvas = document.createElement("canvas"); canvas.width = maxWidth + 10; canvas.height = height + 10; var ctx = canvas.getContext("2d"); // 留5margin var dheight = 5; for (var j = 0; j < oriImgs.length; j++) { var img = oriImgs[j]; var cheight = img.height; var cwidth = img.width; // 留5 margin ctx.drawImage(img, 5, dheight, cwidth, cheight); dheight = dheight + cheight + 5; } // 生成的base64 放在需要的一個(gè)全局變量中。 fbw_img_data = canvas.toDataURL("image/png"); // 清理 $(".temp_img_class").remove(); }; // 之所以使用timer,考慮到dom樹如果沒有加載完成,會取到高度有誤差 var imgTimer = null; imgTimer = setTimeout(function () { getOriginImgBase64($(".temp_img_class")); if (imgTimer) { clearTimeout(imgTimer); } }, 300); }合成效果
圖片一:小站logo
圖片二:小圖標(biāo):
合成效果:
原理簡介主要是通過canvas 獲取多個(gè)圖片的base64編碼,之后通過drawImage 函數(shù)合并和toDataUrl的方式合成。
問題思考問題一:必須支持canvas,否則還需要后臺統(tǒng)一跑腳本處理。
問題二:性能消耗過大。append img 和base64代碼對dom的消耗都挺大,尤其是在移動(dòng)端,很容易造成崩潰。解決辦法:設(shè)定最大寬度,將圖片等比縮放,這樣子就少了向dom擴(kuò)展元素這部分的損耗。
問題三:base64 在傳輸上性能消耗也挺大,沒有file原生的好。
因此:出了必須前端搞定,最好的方式,還是在后臺跑腳本運(yùn)行合并。
個(gè)人小站原文鏈接
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/86251.html
摘要:關(guān)于的介紹關(guān)于的介紹處理數(shù)據(jù)并轉(zhuǎn)換為在上邊我們拿到了一個(gè)一維數(shù)組,接下來就是將它處理為更合理的結(jié)構(gòu)。如果計(jì)算出來這一塊面積就成為了一個(gè)問題目前的思路是,將數(shù)組轉(zhuǎn)換為二維數(shù)組,而不是單純的在對象中用標(biāo)識。 最近突然想做一些好玩的東西,找來找去,想到了之前曾經(jīng)在網(wǎng)上看到過有人用box-shadow畫了一副蒙娜麗莎出來 感覺這個(gè)挺有意思,正好趁著周末,自己也搞一波 前言 在線地址: 優(yōu)化前...
摘要:文章首發(fā)于個(gè)人博客在最近項(xiàng)目中需要實(shí)現(xiàn)一個(gè)精靈動(dòng)畫,素材方只提供了一個(gè)短視頻素材,所以在實(shí)現(xiàn)精靈動(dòng)畫之前先介紹兩個(gè)工具來幫助我們更好的實(shí)現(xiàn)需求。 文章首發(fā)于個(gè)人博客:http://heavenru.com 在最近項(xiàng)目中需要實(shí)現(xiàn)一個(gè)精靈動(dòng)畫,素材方只提供了一個(gè)短視頻素材,所以在實(shí)現(xiàn)精靈動(dòng)畫之前先介紹兩個(gè)工具來幫助我們更好的實(shí)現(xiàn)需求。在這篇文章中,主要是介紹兩個(gè)命令行工具來實(shí)現(xiàn)將一個(gè)短視頻...
閱讀 1769·2021-11-24 09:39
閱讀 1695·2021-11-22 15:22
閱讀 1019·2021-09-27 13:36
閱讀 3276·2021-09-24 10:34
閱讀 3348·2021-07-26 23:38
閱讀 2641·2019-08-29 16:44
閱讀 986·2019-08-29 16:39
閱讀 1116·2019-08-29 16:20