最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript圖片的Base64編碼以及轉(zhuǎn)換詳解

 更新時間:2022年07月27日 14:39:19   作者:MoMeak  
現(xiàn)在網(wǎng)站為了提升用戶的瀏覽體驗越來越多的使用了圖片,而這些圖片通常以 Base64 的形式存儲和加載,下面這篇文章主要給大家介紹了關(guān)于JavaScript圖片的Base64編碼以及轉(zhuǎn)換的相關(guān)資料,需要的朋友可以參考下

什么是 Base64

Base64 是網(wǎng)絡(luò)中存儲和傳輸?shù)亩M制數(shù)據(jù)的普遍用法。Base64 一個字節(jié)只能表示 64 種情況,且編碼格式每個字節(jié)的前兩位都只能是 0,使用剩下的 6 位表示內(nèi)容。

Base64 最早是應(yīng)用在郵件傳輸協(xié)議中的。當(dāng)時郵件傳輸協(xié)議只支持 ASCII 字符傳遞,使用 ASCII 碼來表示所有的英文字符。但是如果要在文件中傳輸圖片、視頻等資源的話,這些資源轉(zhuǎn)成 ASCII 的時候會出現(xiàn)非英文數(shù)字的情況。而且郵件中還存在很多控制字符,這些控制字符又會成為不可見字符。而且,非英文字符和控制字符在傳輸過程中很容易產(chǎn)生錯誤,影響郵件的正確傳輸。為此才有了誕生了一個新的編碼規(guī)則:

把二進制以 3 個字節(jié)為一組,再把每組的 3 個字節(jié)(24 位)轉(zhuǎn)換成 4 個 6 位,每 6 位根據(jù)查表對應(yīng)一個 ASCII 符號。

圖片的 Base64 編碼

我們都知道圖片在網(wǎng)頁中的使用方法通常是使用 img 標(biāo)簽的形式,而 img 標(biāo)簽的 src 屬性會指定一個遠程服務(wù)器上的資源。在網(wǎng)頁加載到瀏覽器中時,瀏覽器會針對每個外部資源都向服務(wù)器發(fā)送一次拉取資源請求。但是這是非常占用網(wǎng)絡(luò)資源的。 而我們經(jīng)常所說的 Base64 存儲展示,則是使用了Data URL 技術(shù)。

我們選擇 Data URL 技術(shù)優(yōu)勢在于:

  • 減少 HTTP 請求;
  • 避免跨域問題;
  • 可像單獨圖片一樣使用,也可以結(jié)合CSS Sprites(雪碧圖)使用

Data URL:

Data URLs,即前綴為 data: 協(xié)議的 URL,其允許內(nèi)容創(chuàng)建者向文檔中嵌入小文件。

Data URLs 由四個部分組成:前綴 (data:)、指示數(shù)據(jù)類型的 MIME 類型、如果非文本則為可選的base64標(biāo)記、數(shù)據(jù)本身:

data:[<mediatype>][;base64],<data>

圖片轉(zhuǎn) Base64 的代碼 

由前端程序員來將圖片轉(zhuǎn)為 Base64 編碼的場景還是非常多的,而且網(wǎng)上搜索的方法好多都沒法用??,這邊給大家兩個絕對可以用的哈~

Promise 實現(xiàn)

/**
 * @param url 圖片路徑
 */
export function getUrlBase64(url) {
    return new Promise((resolve, reject) => {
        let canvas = document.createElement("canvas");
        const ctx = canvas.getContext("2d");
        let img = new Image();
        img.crossOrigin = "Anonymous"; //解決Canvas.toDataURL 圖片跨域問題
        img.src = url;
        img.onload = function () {
            canvas.height = img.height;
            canvas.width = img.width;
            ctx.drawImage(img, 0, 0, img.width, img.height); //參數(shù)可自定義
            const dataURL = canvas.toDataURL("image/jpeg", 1); //獲取Base64編碼
            resolve(dataURL);
            canvas = null; //清除canvas元素
            img = null; //清除img元素
        };
        img.onerror = function () {
            reject(new Error("Could not load image at " + url));
        };
    });
}

回調(diào)函數(shù)實現(xiàn)

/**
 * @param url 圖片路徑
 * @param callback 結(jié)果回調(diào)
 */
export function getUrlBase64Callback(url, callback) {
    let canvas = document.createElement("canvas"); //創(chuàng)建canvas DOM元素
    const ctx = canvas.getContext("2d");
    const img = new Image();
    img.crossOrigin = "Anonymous";
    img.src = url;
    img.onload = function () {
        canvas.height = img.height;
        canvas.width = img.width;
        ctx.drawImage(img, 0, 0, img.width, img.height);
        const dataURL = canvas.toDataURL("image/jpeg", 1); //可選取多種模式
        callback.call(this, dataURL); //回掉函數(shù)獲取Base64編碼
        canvas = null;
    };
}

Base64 圖片編碼并不完美

我不是故意找茬

  • Base64 編碼的數(shù)據(jù)體積通常是原數(shù)據(jù)的體積 4/3,也就是 Data URL 形式的圖片會比二進制格式的圖片體積大 1/3。
  • Data URL 形式的圖片不會被瀏覽器緩存,通常編碼內(nèi)容會包含在CSS,JS文件當(dāng)中以此被瀏覽器緩存。
  • 網(wǎng)頁加載圖片雖然不用訪問服務(wù)器了,但因為base64格式的內(nèi)容太多,所以加載網(wǎng)頁的速度會降低,可能會影響用戶的體驗。
  • base64格式的文本內(nèi)容較多,存儲在數(shù)據(jù)庫中增大了數(shù)據(jù)庫服務(wù)器的壓力(點名一下把大圖片轉(zhuǎn)base64格式存到數(shù)據(jù)庫的同學(xué)??)
  • 頁面解析 CSS 生成的 CSSOM 時間增加。CSSOM 階段阻止任何東西渲染,這意味著在 CSS 沒處理好之前所有東西都不會展示,而如果CSS文件中混入了Base64,那么因為文件體積的大幅增長,解析時間會增長到十倍以上。

參考文章:

【前端攻略】:玩轉(zhuǎn)圖片Base64編碼

Base64 編碼知識,一文打盡!

圖片轉(zhuǎn)換成base64格式的優(yōu)缺點

總結(jié)

到此這篇關(guān)于JavaScript圖片的Base64編碼以及轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)JS圖片Base64編碼轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript數(shù)據(jù)結(jié)構(gòu)中串的表示與應(yīng)用實例

    JavaScript數(shù)據(jù)結(jié)構(gòu)中串的表示與應(yīng)用實例

    這篇文章主要介紹了JavaScript數(shù)據(jù)結(jié)構(gòu)中串的表示與應(yīng)用,結(jié)合實例形式簡單分析了基于javascript順序操作實現(xiàn)串結(jié)構(gòu)與串的拼接操作相關(guān)技巧,需要的朋友可以參考下
    2017-04-04
  • JavaScript中實現(xiàn)單體模式分享

    JavaScript中實現(xiàn)單體模式分享

    這篇文章主要介紹了JavaScript中實現(xiàn)單體模式分享,單體模式的定義:單體是一個用來劃分命名空間并將一批相關(guān)方法和屬性組織在一起的對象,如果它能夠被實例化,那么只能被實例化一次,需要的朋友可以參考下
    2015-01-01
  • JS實現(xiàn)的合并兩個有序鏈表算法示例

    JS實現(xiàn)的合并兩個有序鏈表算法示例

    這篇文章主要介紹了JS實現(xiàn)的合并兩個有序鏈表算法,結(jié)合實例形式分析了JavaScript鏈表的定義、節(jié)點插入、刪除、查找等相關(guān)算法實現(xiàn)技巧,需要的朋友可以參考下
    2019-02-02
  • 詳解webpack import()動態(tài)加載模塊踩坑

    詳解webpack import()動態(tài)加載模塊踩坑

    這篇文章主要介紹了詳解webpack import()動態(tài)加載模塊踩坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • 原生js封裝自定義滾動條

    原生js封裝自定義滾動條

    本文主要介紹了原生js封裝自定義滾動條的相關(guān)知識。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • 微信小程序?qū)崿F(xiàn)單列下拉菜單效果

    微信小程序?qū)崿F(xiàn)單列下拉菜單效果

    這篇文章主要介紹了微信小程序單列下拉菜單,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • javascript實現(xiàn)詳細時間提醒信息效果的方法

    javascript實現(xiàn)詳細時間提醒信息效果的方法

    這篇文章主要介紹了javascript實現(xiàn)詳細時間提醒信息效果的方法,涉及javascript操作時間的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • ionic js 復(fù)選框 與普通的 HTML 復(fù)選框到底有沒區(qū)別

    ionic js 復(fù)選框 與普通的 HTML 復(fù)選框到底有沒區(qū)別

    本文通過實例給大家演示ionic js 復(fù)選框 與普通的 HTML 復(fù)選框到底有沒區(qū)別的相關(guān)知識,非常不錯具有參考借鑒價值,感興趣的朋友一起學(xué)習(xí)吧
    2016-06-06
  • javascript String 對象

    javascript String 對象

    javascript數(shù)據(jù)庫操作方法包括字符串大小寫,字符串搜索,提取字符串等
    2008-04-04
  • JS獲取年月日時分秒的方法分析

    JS獲取年月日時分秒的方法分析

    這篇文章主要介紹了JS獲取年月日時分秒的方法,結(jié)合實例形式分析了JS獲取具體時間的常犯錯誤與相應(yīng)解決方法,需要的朋友可以參考下
    2016-11-11

最新評論

伊通| 承德县| 东至县| 天台县| 洛隆县| 六枝特区| 西畴县| 仙游县| 涿鹿县| 达日县| 古田县| 华坪县| 佳木斯市| 扎鲁特旗| 南陵县| 博白县| 枝江市| 阜南县| 和静县| 保亭| 耒阳市| 桂东县| 大田县| 镇赉县| 油尖旺区| 巴林右旗| 固镇县| 商南县| 灵丘县| 长宁县| 苍山县| 淮阳县| 石门县| 资讯 | 南川市| 高青县| 田林县| 滨海县| 平阴县| 海宁市| 巫溪县|