成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

canvas 生成和合并圖片

pkwenda / 2580人閱讀

摘要:先上代碼獲取上傳和展現(xiàn)的圖片。解決辦法設(shè)定最大寬度,將圖片等比縮放,這樣子就少了向擴(kuò)展元素這部分的損耗。因此出了必須前端搞定,最好的方式,還是在后臺(tái)跑腳本運(yùn)行合并。

先說(shuō)背景:工作中遇到一個(gè)問(wèn)題,file組件上傳圖片,file是可以上傳n張圖片;但是,后臺(tái)邏輯歷史原因,只能展現(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è)縮略圖,無(wú)法取到真正大小
    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樹如果沒(méi)有加載完成,會(huì)取到高度有誤差
    var imgTimer = null;
    imgTimer = setTimeout(function () {
        getOriginImgBase64($(".temp_img_class"));

        if (imgTimer) {
            clearTimeout(imgTimer);
        }
    }, 300);
}
合成效果

圖片一:小站logo

圖片二:小圖標(biāo):

合成效果:

原理簡(jiǎn)介

主要是通過(guò)canvas 獲取多個(gè)圖片的base64編碼,之后通過(guò)drawImage 函數(shù)合并和toDataUrl的方式合成。

問(wèn)題思考

問(wèn)題一:必須支持canvas,否則還需要后臺(tái)統(tǒng)一跑腳本處理。

問(wèn)題二:性能消耗過(guò)大。append img 和base64代碼對(duì)dom的消耗都挺大,尤其是在移動(dòng)端,很容易造成崩潰。解決辦法:設(shè)定最大寬度,將圖片等比縮放,這樣子就少了向dom擴(kuò)展元素這部分的損耗。

問(wèn)題三:base64 在傳輸上性能消耗也挺大,沒(méi)有file原生的好。

因此:出了必須前端搞定,最好的方式,還是在后臺(tái)跑腳本運(yùn)行合并。

個(gè)人小站原文鏈接

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/86251.html

相關(guān)文章

  • 使用box-shadow進(jìn)行畫圖(性能優(yōu)化終結(jié)者)

    摘要:關(guān)于的介紹關(guān)于的介紹處理數(shù)據(jù)并轉(zhuǎn)換為在上邊我們拿到了一個(gè)一維數(shù)組,接下來(lái)就是將它處理為更合理的結(jié)構(gòu)。如果計(jì)算出來(lái)這一塊面積就成為了一個(gè)問(wèn)題目前的思路是,將數(shù)組轉(zhuǎn)換為二維數(shù)組,而不是單純的在對(duì)象中用標(biāo)識(shí)。 最近突然想做一些好玩的東西,找來(lái)找去,想到了之前曾經(jīng)在網(wǎng)上看到過(guò)有人用box-shadow畫了一副蒙娜麗莎出來(lái) 感覺這個(gè)挺有意思,正好趁著周末,自己也搞一波 前言 在線地址: 優(yōu)化前...

    snifes 評(píng)論0 收藏0
  • 使用 canvas 實(shí)現(xiàn)精靈動(dòng)畫

    摘要:文章首發(fā)于個(gè)人博客在最近項(xiàng)目中需要實(shí)現(xiàn)一個(gè)精靈動(dòng)畫,素材方只提供了一個(gè)短視頻素材,所以在實(shí)現(xiàn)精靈動(dòng)畫之前先介紹兩個(gè)工具來(lái)幫助我們更好的實(shí)現(xiàn)需求。 文章首發(fā)于個(gè)人博客:http://heavenru.com 在最近項(xiàng)目中需要實(shí)現(xiàn)一個(gè)精靈動(dòng)畫,素材方只提供了一個(gè)短視頻素材,所以在實(shí)現(xiàn)精靈動(dòng)畫之前先介紹兩個(gè)工具來(lái)幫助我們更好的實(shí)現(xiàn)需求。在這篇文章中,主要是介紹兩個(gè)命令行工具來(lái)實(shí)現(xiàn)將一個(gè)短視頻...

    岳光 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<