JavaScript图片的Base64编码以及转换详解

 更新时间:2022年07月27日 14:39:19   作者:MoMeak  
现在网站为了提升用户的浏览体验越来越多的使用了图片,而这些图片通常以 Base64 的形式存储和加载,下面这篇文章主要给大家介绍了关于JavaScript图片的Base64编码以及转换的相关资料,需要的朋友可以参考下

什么是 Base64

Base64 是网络中存储和传输的二进制数据的普遍用法。Base64 一个字节只能表示 64 种情况,且编码格式每个字节的前两位都只能是 0,使用剩下的 6 位表示内容。

Base64 最早是应用在邮件传输协议中的。当时邮件传输协议只支持 ASCII 字符传递,使用 ASCII 码来表示所有的英文字符。但是如果要在文件中传输图片、视频等资源的话,这些资源转成 ASCII 的时候会出现非英文数字的情况。而且邮件中还存在很多控制字符,这些控制字符又会成为不可见字符。而且,非英文字符和控制字符在传输过程中很容易产生错误,影响邮件的正确传输。为此才有了诞生了一个新的编码规则:

把二进制以 3 个字节为一组,再把每组的 3 个字节(24 位)转换成 4 个 6 位,每 6 位根据查表对应一个 ASCII 符号。

图片的 Base64 编码

我们都知道图片在网页中的使用方法通常是使用 img 标签的形式,而 img 标签的 src 属性会指定一个远程服务器上的资源。在网页加载到浏览器中时,浏览器会针对每个外部资源都向服务器发送一次拉取资源请求。但是这是非常占用网络资源的。 而我们经常所说的 Base64 存储展示,则是使用了Data URL 技术。

我们选择 Data URL 技术优势在于:

  • 减少 HTTP 请求;
  • 避免跨域问题;
  • 可像单独图片一样使用,也可以结合CSS Sprites(雪碧图)使用

Data URL:

Data URLs,即前缀为 data: 协议的 URL,其允许内容创建者向文档中嵌入小文件。

Data URLs 由四个部分组成:前缀 (data:)、指示数据类型的 MIME 类型、如果非文本则为可选的base64标记、数据本身:

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

图片转 Base64 的代码 

由前端程序员来将图片转为 Base64 编码的场景还是非常多的,而且网上搜索的方法好多都没法用😅,这边给大家两个绝对可以用的哈~

Promise 实现

/**
 * @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); //参数可自定义
            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));
        };
    });
}

回调函数实现

/**
 * @param url 图片路径
 * @param callback 结果回调
 */
export function getUrlBase64Callback(url, callback) {
    let canvas = document.createElement("canvas"); //创建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); //回掉函数获取Base64编码
        canvas = null;
    };
}

Base64 图片编码并不完美

我不是故意找茬

  • Base64 编码的数据体积通常是原数据的体积 4/3,也就是 Data URL 形式的图片会比二进制格式的图片体积大 1/3。
  • Data URL 形式的图片不会被浏览器缓存,通常编码内容会包含在CSS,JS文件当中以此被浏览器缓存。
  • 网页加载图片虽然不用访问服务器了,但因为base64格式的内容太多,所以加载网页的速度会降低,可能会影响用户的体验。
  • base64格式的文本内容较多,存储在数据库中增大了数据库服务器的压力(点名一下把大图片转base64格式存到数据库的同学🙂)
  • 页面解析 CSS 生成的 CSSOM 时间增加。CSSOM 阶段阻止任何东西渲染,这意味着在 CSS 没处理好之前所有东西都不会展示,而如果CSS文件中混入了Base64,那么因为文件体积的大幅增长,解析时间会增长到十倍以上。

参考文章:

【前端攻略】:玩转图片Base64编码

Base64 编码知识,一文打尽!

图片转换成base64格式的优缺点

总结

到此这篇关于JavaScript图片的Base64编码以及转换的文章就介绍到这了,更多相关JS图片Base64编码转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaScript数据结构中串的表示与应用实例

    JavaScript数据结构中串的表示与应用实例

    这篇文章主要介绍了JavaScript数据结构中串的表示与应用,结合实例形式简单分析了基于javascript顺序操作实现串结构与串的拼接操作相关技巧,需要的朋友可以参考下
    2017-04-04
  • JavaScript中实现单体模式分享

    JavaScript中实现单体模式分享

    这篇文章主要介绍了JavaScript中实现单体模式分享,单体模式的定义:单体是一个用来划分命名空间并将一批相关方法和属性组织在一起的对象,如果它能够被实例化,那么只能被实例化一次,需要的朋友可以参考下
    2015-01-01
  • JS实现的合并两个有序链表算法示例

    JS实现的合并两个有序链表算法示例

    这篇文章主要介绍了JS实现的合并两个有序链表算法,结合实例形式分析了JavaScript链表的定义、节点插入、删除、查找等相关算法实现技巧,需要的朋友可以参考下
    2019-02-02
  • 详解webpack import()动态加载模块踩坑

    详解webpack import()动态加载模块踩坑

    这篇文章主要介绍了详解webpack import()动态加载模块踩坑,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • 原生js封装自定义滚动条

    原生js封装自定义滚动条

    本文主要介绍了原生js封装自定义滚动条的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • 微信小程序实现单列下拉菜单效果

    微信小程序实现单列下拉菜单效果

    这篇文章主要介绍了微信小程序单列下拉菜单,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • javascript实现详细时间提醒信息效果的方法

    javascript实现详细时间提醒信息效果的方法

    这篇文章主要介绍了javascript实现详细时间提醒信息效果的方法,涉及javascript操作时间的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • ionic js 复选框 与普通的 HTML 复选框到底有没区别

    ionic js 复选框 与普通的 HTML 复选框到底有没区别

    本文通过实例给大家演示ionic js 复选框 与普通的 HTML 复选框到底有没区别的相关知识,非常不错具有参考借鉴价值,感兴趣的朋友一起学习吧
    2016-06-06
  • javascript String 对象

    javascript String 对象

    javascript数据库操作方法包括字符串大小写,字符串搜索,提取字符串等
    2008-04-04
  • JS获取年月日时分秒的方法分析

    JS获取年月日时分秒的方法分析

    这篇文章主要介绍了JS获取年月日时分秒的方法,结合实例形式分析了JS获取具体时间的常犯错误与相应解决方法,需要的朋友可以参考下
    2016-11-11

最新评论