JS实现图片元素转BASE64编码的简单示例

 更新时间:2023年12月26日 11:14:05   作者:集成显卡  
在Web开发中,我们经常需要将图片转换为Base64格式,以便在不依赖外部资源的情况下直接在HTML中使用,在这篇文章中,我将向您展示如何使用JavaScript将图片元素转BASE64编码,需要的朋友可以参考下

这里分享前端实现图片转 BASE64 的通用方法,支持缩放灰度处理

/**
* 将指定元素对象转换为 Base64 格式
* @param {HTMLImageElement|String} img - 图片元素(如通过 document.querySelector 获取)或者选择器
* @param {Object} ps - 额外参数
* @param {Number} ps.scale - 缩放,默认 1
* @param {Boolean} ps.withGray - 是否进行灰度处理,默认 true
* @param {String} ps.format - 图片格式,默认 image/jpeg
* @param {Boolean} ps.natural - 是否使用图片元素的原始尺寸,默认 true
* @returns {String}
*/
function imgToBase64(img, ps={}) {
    if(typeof(img)==='string')  img = document.querySelector(img)
    if(Object.prototype.toString.call(img) != '[object HTMLImageElement]')
        throw Error(`参数 img 必须是一个有效的 HTMLImageElement 对象或选择器`)

    ps = Object.assign({scale:1.0, withGray:true, format: "image/jpeg", natural:true}, ps)
    let canvas = document.createElement("canvas")
    let ctx = canvas.getContext("2d")
    let width = ps.natural? img.naturalWidth : img.width
    let height = ps.natural? img.naturalHeight : img.height

    canvas.width = width * ps.scale
    canvas.height = height * ps.scale
    ctx.drawImage(img, 0, 0, width, height, 0, 0, canvas.width, canvas.height)

    //灰度处理,一定程度上使得图片内字符更加清晰
    if (ps.withGray) {
        let imgD = ctx.getImageData(0, 0, canvas.width, canvas.height)
        let len = canvas.width * canvas.height * 4
        for (let i = 0; i < len; i += 4) {
            let gray = Math.floor((imgD.data[i] + imgD.data[i + 1] + imgD.data[i + 2]) / 3)
            imgD.data[i] = imgD.data[i + 1] = imgD.data[i + 2] = gray > 100 ? gray : 0
        }

        ctx.putImageData(imgD, 0, 0)
    }

    return canvas.toDataURL(ps.format)
}

使用方式

imgToBase64(".logo")
// 缩放 0.5 倍
imgToBase64(document.querySelector(".logo"), {scale:0.5})

如需处理远程图片,可以参考上面代码进行改造。

拓展

废话不多说,直接上代码

base64 (url) {
      return new Promise((resolve) => {
        const image = new Image()
        // 先设置图片跨域属性
        image.crossOrigin = 'Anonymous'
        // 再给image赋值src属性,先后顺序不能颠倒
        image.src = url
        image.onload = function () {
          const canvas = document.createElement('CANVAS')
          // 设置canvas宽高等于图片实际宽高
          canvas.width = image.width
          canvas.height = image.height
          canvas.getContext('2d').drawImage(image, 0, 0)
          // toDataUrl可以接收2个参数,参数一:图片类型,参数二: 图片质量0-1(不传默认为0.92)
          const dataURL = canvas.toDataURL('image/jpeg')
          resolve(dataURL)
        }
        image.onerror = () => {
          resolve({ message: '相片处理失败' })
        }
      })
    },

我们传入一个图

async mounted () {
    // this.init()
    const url = await this.base64('https://fuss10.elemecdn.com/a/3f/3302e58f9a181d2509f3dc0fa68b0jpeg.jpeg')
    console.log(url)
  },

片地址看看是否成功 

但是,一般我们在做这样的需求前,处理的图片肯定不止一张,接下来就要批量处理,但是这个方法是异步,我们要将一个数组内的每个对象的地址都转成base64,才算真正完成我们的功能。前端一般接收到后端的数据一般是这种格式。

但是我们正常使用map函数遍历去将图片地址转成base64,上代码:

 const newImgOBj = await Promise.all(this.imgOBj.map(async (item) => {
      return {
        name: item.name,
        img: await this.base64(item.img)
      }
    }))
    console.log(newImgOBj)

打印一下看结果发现我们的图片地址已经变成了base64编码。

最后我们将图片使用img标签正常渲染就好了,小知识:浏览器在识别同一个一模一样的图片地址,浏览器只会请求一遍该图片资源哦。 

以上就是JS实现图片元素转BASE64编码的简单示例的详细内容,更多关于JS图片转BASE64的资料请关注脚本之家其它相关文章!

相关文章

  • JavaScript如何实现组合列表框中元素移动效果

    JavaScript如何实现组合列表框中元素移动效果

    在页面中有两个列表框,需要把其中一个列表框的元素移动到另一个列表框,怎么实现此功能呢,下面通过本文给大家介绍JavaScript如何实现组合列表框中元素移动效果,感兴趣的朋友一起学习吧
    2016-03-03
  • 微信小程序页面间传值与页面取值操作实例分析

    微信小程序页面间传值与页面取值操作实例分析

    这篇文章主要介绍了微信小程序页面间传值与页面取值操作,结合实例形式分析了微信小程序页面间传值及页面取值操作相关实现技巧与操作注意事项,需要的朋友可以参考下
    2019-04-04
  • javascript parseInt与Number函数的区别

    javascript parseInt与Number函数的区别

    在js中,如果你使用parseInt("08"),一般都会认为会返回8,然而实际上返回了0.但是用Number("08")返回的才是8.
    2010-01-01
  • JavaScript常见数组方法之如何转置矩阵

    JavaScript常见数组方法之如何转置矩阵

    这篇文章主要给大家介绍了关于JavaScript常见数组方法之如何转置矩阵的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-03-03
  • 详解怎么检测和防止JavaScript死循环

    详解怎么检测和防止JavaScript死循环

    最近工作中遇到了一些死循环导致的页面卡死问题,经过 trouble shooting 和代码修复解决了问题,所以下面这篇文章主要给大家介绍了怎么检测和防止JavaScript死循环的相关资料,需要的朋友可以参考下
    2021-11-11
  • JS运动改变单物体透明度的方法分析

    JS运动改变单物体透明度的方法分析

    这篇文章主要介绍了JS运动改变单物体透明度的方法,结合实例形式分析了页面元素属性动态修改相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • JavaScript字符串的长度问题

    JavaScript字符串的长度问题

    这篇文章主要介绍了JavaScript字符串的长度问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • js模仿windows桌面图标排列算法具体实现(附图)

    js模仿windows桌面图标排列算法具体实现(附图)

    需要引入Jquery,如果需要全部功能,请引入jquery-ui和jquery-ui.css,具体实现步骤如下,感兴趣的朋友可以参考下哈
    2013-06-06
  • JavaScript网格中的最小路径讲解

    JavaScript网格中的最小路径讲解

    这篇文章主要介绍了JavaScript网格中的最小路径讲解,所有路径经过的单元格的 值之和 加上 所有移动的 代价之和 。从 第一行 任意单元格出发,返回到达 最后一行 任意单元格的最小路径代价
    2022-06-06
  • js获得鼠标的坐标值的方法

    js获得鼠标的坐标值的方法

    js获得鼠标的坐标值的方法,需要的朋友可以参考一下
    2013-03-03

最新评论