摘要:先上代碼獲取上傳和展現的圖片。解決辦法設定最大寬度,將圖片等比縮放,這樣子就少了向擴展元素這部分的損耗。因此出了必須前端搞定,最好的方式,還是在后臺跑腳本運行合并。
先上代碼先說背景:工作中遇到一個問題,file組件上傳圖片,file是可以上傳n張圖片;但是,后臺邏輯歷史原因,只能展現一張。因此:考慮到成本,決定在前端將多張圖片合并成一張給后端。
_mergeImage2Canvas:function() { // 獲取file上傳和展現的圖片。一般file上傳之后,有個小圖標展現。 var imgs = $(".img_files"); if (!imgs) { return false; } // 創建原始圖像 // 原因:file上傳之后,展現往往是個縮略圖,無法取到真正大小 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"; // 不顯示,僅供調用 fbwImg.style.display = "none"; // 臨時區域擴展 $("#temp_section").append(fbwImg); } // 合并原始圖片,生成一個新的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; } // 設定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 放在需要的一個全局變量中。 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
圖片二:小圖標:
合成效果:
原理簡介主要是通過canvas 獲取多個圖片的base64編碼,之后通過drawImage 函數合并和toDataUrl的方式合成。
問題思考問題一:必須支持canvas,否則還需要后臺統一跑腳本處理。
問題二:性能消耗過大。append img 和base64代碼對dom的消耗都挺大,尤其是在移動端,很容易造成崩潰。解決辦法:設定最大寬度,將圖片等比縮放,這樣子就少了向dom擴展元素這部分的損耗。
問題三:base64 在傳輸上性能消耗也挺大,沒有file原生的好。
因此:出了必須前端搞定,最好的方式,還是在后臺跑腳本運行合并。
個人小站原文鏈接
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86251.html
摘要:關于的介紹關于的介紹處理數據并轉換為在上邊我們拿到了一個一維數組,接下來就是將它處理為更合理的結構。如果計算出來這一塊面積就成為了一個問題目前的思路是,將數組轉換為二維數組,而不是單純的在對象中用標識。 最近突然想做一些好玩的東西,找來找去,想到了之前曾經在網上看到過有人用box-shadow畫了一副蒙娜麗莎出來 感覺這個挺有意思,正好趁著周末,自己也搞一波 前言 在線地址: 優化前...
摘要:文章首發于個人博客在最近項目中需要實現一個精靈動畫,素材方只提供了一個短視頻素材,所以在實現精靈動畫之前先介紹兩個工具來幫助我們更好的實現需求。 文章首發于個人博客:http://heavenru.com 在最近項目中需要實現一個精靈動畫,素材方只提供了一個短視頻素材,所以在實現精靈動畫之前先介紹兩個工具來幫助我們更好的實現需求。在這篇文章中,主要是介紹兩個命令行工具來實現將一個短視頻...
閱讀 1756·2021-11-24 09:39
閱讀 1686·2021-11-22 15:22
閱讀 1002·2021-09-27 13:36
閱讀 3230·2021-09-24 10:34
閱讀 3329·2021-07-26 23:38
閱讀 2633·2019-08-29 16:44
閱讀 974·2019-08-29 16:39
閱讀 1104·2019-08-29 16:20